Следующая ситуация: существует массив, действующий как кросс-таблица (mergeSet).Кроме того, существует набор целевых значений и набор исходных значений.Исходные значения могут быть объединены с целевыми значениями через перекрестную таблицу.- Но как можно выразить внешнее соединение, например, targetSet с другими таблицами, используя только одно выражение LINQ?
В настоящее время я нашел только решения, использующие несколько выражений LINQ (т.е. внутреннее соединение targetSet + mergeSet + sourceSet, затем чистая левая внешняя часть и, наконец, конкатенация innerJoinResult и externalPart).
var mergeSet = new[]
{
new KeyValuePair<int, int>(3, 4),
new KeyValuePair<int, int>(5, 6)
};
var targetSet = new[] { 1, 3, 5, 7 };
var sourceSet = new[] { 4, 6 };
var innerJoinResult =
from mergeItem in mergeSet
join sourceItem in sourceSet on mergeItem.Value equals sourceItem
join targetItem in targetSet on mergeItem.Key equals targetItem
group sourceItem by targetItem;
var outerPart =
from targetItem in targetSet
where !mergeSet.Any(mergeItem => mergeItem.Key == targetItem)
group 0 by targetItem; // Fill the right part with zero.
var outerJoinResult = outerPart.Concat(innerJoinResult);