C# 当right为null时的Left join
我试图在c中左键联接,以便只从Foo中查找不在Bar中的值。 在SQL中,我通常会这样做:C# 当right为null时的Left join,c#,linq,C#,Linq,我试图在c中左键联接,以便只从Foo中查找不在Bar中的值。 在SQL中,我通常会这样做: SELECT * FROM FOO f LEFT JOIN BAR b ON f.ID = b.ID WHERE b.ID IS NULL 对于linq,我通常会这样做: var matches = Foos.Join( Bars, foo => foo.ID, bar => bar.ID, (foo, bar) => foo ).Select(x =&
SELECT * FROM FOO f
LEFT JOIN BAR b ON f.ID = b.ID
WHERE b.ID IS NULL
对于linq,我通常会这样做:
var matches = Foos.Join(
Bars,
foo => foo.ID,
bar => bar.ID,
(foo, bar) => foo
).Select(x => x.ID);
然后:
var noMatch = Foos.Where(x => !matches.Contains(x.ID));
现在问一个问题:在.Join函数中有没有实现这一点的方法?您可以执行左连接,如下所示:
var query= from f in Foos
join b in Bars on f.Id equals b.Id into gb
from sb in gb.DefaulfIfEmpty()
where sb.ID==null
select {f, sb};
像这样的工作:
Foos.
.GroupJoin(
Bars,
f => f.Id,
b => b.Id,
(f, lj) => new { f, lj })
.SelectMany(t => t.lj.DefaultIfEmpty(),
(t, b) => new {
foo = t.f,
bar = b
})
.Where(a => a.bar.Any() == false)
.ToList()
查询语法版本已经回答,但我个人更喜欢方法语法:
var result = Foos
.GroupJoin(
Bars,
f => f.ID,
b => b.ID,
(fos, bas) => new { Foo = fos, Bar = bas })
.SelectMany(
sum => sum.Bar.DefaultIfEmpty(),
(sum, flatBar) => new
{
Foo = sum.Foo,
Bar = flatBar
})
.Where(anon => !anon.Bar.Any());
我认为你的linq join是错误的;它必须是GroupJoin。查看哪些处理连接。然后,您可以选择适当的空值。对于左连接,linq等价物是GroupJoin。不确定,但这似乎适用于context.Foos.Wherefoo=>!foo.bar.Any.ToList。我不确定EF是否在客户端评估任何部件。这就是为什么我不把它作为一个答案什么是lambda等价物?使用上面引用的GroupJoin,但IMHO查询语法更好地描述了您试图实现的目标,它接近sql syntaxI绝对同意;lambda语法非常复杂。在某些情况下,我更喜欢使用更好的方法语法,因为在最后,查询语法只是一种语法糖,查询被转换为方法语法,但这取决于上下文;我认为这缺少了b.ID为NULL的地方condition@AlanCheungt.lj.DefaultIfEmpty是否对此进行了解释?Sorta,它将一个空列表放置到位,否则列表lj将为空,但不会从结果中删除它们。它最终在下面的匿名对象中创建了一个bar=empty LIST抱歉,我没有正确阅读您的第一个问题。是的,条件缺失的地方。