0

次の状況: クロステーブル (mergeSet) として機能する配列が存在します。さらに、ターゲット値のセットとソース値のセットが存在します。ソース値は、クロステーブルを介してターゲット値と結合できます。- しかし、LINQ 式を 1 つだけ使用して、たとえば targetSet の外部結合を他のテーブルに対して表現するにはどうすればよいでしょうか?

現在、複数の LINQ 式を使用するソリューションのみを見つけました (つまり、targetSet+mergeSet+sourceSet の内部結合、次に純粋な左外部部分、最後に innerJoinResult と outerPart の連結)。

        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);
4

1 に答える 1

2

次のコード:

    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
于 2010-10-26T01:29:00.033 に答える