- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
我知道除了知道什么是“最喜欢的编程卡通”之外,stackoverflow 会对我有所帮助:P 这是接受的答案: Bill Karwin 感谢大家的帮助(我想给你们加倍投票) 我的查询结果是这样的(这是
我查询了此查询,该查询将相关图像返回到评论 return $comments = \DB::table('comments')->select('comments.comment','com
如果没有任何地址(内部连接),我有以下 LINQ 返回零。我如何将其设为 Outer Join 然后仅 Take(1)? var results = query.Join(
我是一名优秀的程序员,十分优秀!