GroupJoin方法在关系数据库术语中没有直接等价,但它实现了内连接和左外连接的超集.左外连接是返回第一个(左)数据源的每个元素的连接,即使它在其他数据源中没有相关元素也是如此.
我认为GroupJoin相当于左连接.因为外部的所有元素都将返回内部匹配项的集合.如果在inner中找不到匹配的项,则空集合将与外部元素配对.
但为什么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;
);
Run Code Online (Sandbox Code Playgroud)
GroupJoin的原始逻辑:
Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector, comparer);
foreach (TOuter current in outer)
{
yield return resultSelector(current, lookup[outerKeySelector(current)]);
}
Run Code Online (Sandbox Code Playgroud)
我们也可以重写一个LeftJoin:
Lookup<TKey, TInner> lookup = Lookup<TKey, TInner>.CreateForJoin(inner, innerKeySelector,
foreach (TOuter current in outer)
{
yield return resultSelector(current, lookup[outerKeySelector(current)].DefaultIfEmpty());
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*zek 10
考虑以下情况:
TableA - Users
id -- name
1 -- Tom
2 -- John
3 -- Ted
TableB - Cars
id -- userId
1 -- 1
2 -- 3
3 -- 3
Run Code Online (Sandbox Code Playgroud)
LEFT JOIN用户名和车辆ID的标准将返回:
name -- carId
Tom -- 1
John -- NULL
Ted -- 2
Ted -- 3
Run Code Online (Sandbox Code Playgroud)
使用GroupJoin你会得到:
name -- carId
Tom -- [ 1 ]
John -- [ ]
Ted -- [ 2, 3 ]
Run Code Online (Sandbox Code Playgroud)
看到不同?
在SQL中,左侧idem显示为匹配JOIN条件的正确项目的数量.
在GroupJoin您将获得左侧项目一次并匹配右侧项目的集合JOIN状态.