groupjoin方法在关系数据库中没有直接等价的方法
但是它实现了内部连接和左外部连接的超集
加入。左外部联接是返回
第一个(左)数据源,即使它在
其他数据源。
我认为groupjoin相当于left join。因为outer的所有元素都将与inner中匹配项的集合一起返回。如果在内部找不到匹配的项,则空集合将与外部的元素配对。
但为什么msdn会这么说呢?
我已经阅读了groupjoin和join的源代码。马尔金朱拉泽克提供了一个例子。但我认为我们可以使用以下代码。
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());
}
最佳答案
考虑以下情况:
TableA - Users
id -- name
1 -- Tom
2 -- John
3 -- Ted
TableB - Cars
id -- userId
1 -- 1
2 -- 3
3 -- 3
用户名和汽车识别号的标准
LEFT JOIN
将返回:name -- carId
Tom -- 1
John -- NULL
Ted -- 2
Ted -- 3
使用
GroupJoin
将得到:name -- carId
Tom -- [ 1 ]
John -- [ ]
Ted -- [ 2, 3 ]
看到区别了吗?
在SQL中,左侧的IDEM被显示为与“ccc>条件匹配的多个正确项目的许多倍。
在
JOIN
上,您将获得一次左侧项和一组匹配GroupJoin
条件的右侧项。