Как выразить внешние объединения с кросс-таблицами в виде одного выражения Linq - PullRequest
0 голосов
/ 26 октября 2010

Следующая ситуация: существует массив, действующий как кросс-таблица (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);

1 Ответ

2 голосов
/ 26 октября 2010

следующий код:

    var outerJoinResult =
        (from ti1 in targetSet
         join mi1 in mergeSet on ti1 equals mi1.Key into joinedMerge
         from jm1 in joinedMerge.DefaultIfEmpty()
         join si1 in sourceSet on jm1.Value equals si1 into joinedSource
         from js1 in joinedSource.DefaultIfEmpty()
         select new { target = ti1, source = js1 }).ToList();

    outerJoinResult.ForEach(x => Console.Out.WriteLine("Source: {0}, Target: {1}", x.source, x.target));

напечатал:

Source: 0, Target: 1
Source: 4, Target: 3
Source: 6, Target: 5
Source: 0, Target: 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...