GroupJoin 方法在关系数据库术语中没有直接等价物,但它实现了内连接和左外连接的超集。左外连接是返回第一个(左)数据源的每个元素的连接,即使它在另一个数据源中没有相关元素。
我认为 GroupJoin 相当于左连接。因为外部的所有元素都将返回内部匹配项的集合。如果在 inner 中没有找到匹配项,则将一个空集合与 outer 中的元素配对。
但是为什么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());
}