4

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

2 回答 2

10

考虑以下情况:

TableA - Users

id -- name
1  -- Tom
2  -- John
3  -- Ted

TableB - Cars

id -- userId
1  -- 1
2  -- 3
3  -- 3

用户名和汽车 ID 的标准LEFT JOIN将返回:

name -- carId
Tom  -- 1
John -- NULL
Ted  -- 2
Ted  -- 3

使用GroupJoin你会得到:

name -- carId
Tom  -- [ 1 ]
John -- [ ]
Ted  -- [ 2, 3 ]

看到不同?

在 SQL 中,左侧 idem 显示的次数与JOIN存在匹配条件的右侧项一样多。

GroupJoin您将获得一次左侧项目和一组匹配JOIN条件的右侧项目。

于 2013-07-19T09:20:55.817 回答
1

我会添加评论,但我的代表还不足以做到这一点。

Marcin 是正确的,您的问题的简单答案是;是的,您可以以与此相同的方式使 Left Outer Join 返回结果GroupJoin,但为什么呢?

GroupJoin执行左外连接,然后对结果进行分组。Left Outer Join 将只返回一个列表(根据 Marcin 的示例)而不进行任何分组,如果您真的想要,您可以这样做,但(无论出于何种原因)您可能不想这样做。

编辑:拼写

于 2013-07-19T10:07:11.223 回答