4

GroupJoin メソッドには、リレーショナル データベース用語で直接相当するものはありませんが、内部結合と左外部結合のスーパーセットを実装しています。左外部結合は、他のデータ ソースに相関要素がない場合でも、最初 (左) のデータ ソースの各要素を返す結合です。

GroupJoin は左結合に相当すると思います。アウターのすべての要素は、インナーの一致したアイテムのコレクションで返されるためです。内部に一致する項目が見つからない場合、空のコレクションが外部の要素とペアになります。

しかし、なぜmsdnはそう言うのでしょうか?

GroupJoin と Join のソース コードを読みました。MarcinJuraszek は例を提供します。しかし、次のコードを使用できると思います。

Users.GroupJoin(Cars,user=>id,Car=>userId,(user,cars)=>
if(cars.count==0)
{
//John -- NULL
}
else
{
//Ted  -- [ 2, 3 ]
}
return result;
);

GroupJoin の元のロジック:

Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, comparer);
foreach (TOuter current in outer)
{
    yield return resultSelector(current, lookup[outerKeySelector(current)]);
}

LeftJoin を書き換えることもできます。

Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, 
foreach (TOuter current in outer)
{
    yield return resultSelector(current, lookup[outerKeySelector(current)].DefaultIfEmpty());
}
4

2 に答える 2