gpt4 book ai didi

c# - 为什么 GroupJoin 不是左外连接?

转载 作者:太空狗 更新时间:2023-10-30 00:15:02 25 4
gpt4 key购买 nike

The GroupJoin method has no direct equivalent in relational database terms, but it implements a superset of inner joins and left outer joins. A left outer join is a join that returns each element of the first (left) data source, even if it has no correlated elements in the other data source.

我认为 GroupJoin 相当于左连接。因为 outer 的所有元素都将与 inner 中匹配项的集合一起返回。如果在 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());
}

最佳答案

考虑以下情况:

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 中,左侧相同的显示次数与存在的 JOIN 条件匹配的右侧项目的次数相同。

GroupJoin 上,您将获得一次左侧项目和一组符合 JOIN 条件的右侧项目。

关于c# - 为什么 GroupJoin 不是左外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17742345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com