如何在 LINQ to SQL 中编写右侧为空的 LEFT OUTER JOIN?
How to write a LEFT OUTER JOIN where the right side is null in LINQ to SQL?
如何在 LINQ 中将 LEFT OUTER JOIN 写入 SQL,其中右侧为空?
我想要的结果的图形表示是这样的:
图片来源 Jeff Atwood.
以此SQL为例:
select Document.*
from Document left outer join Invoice
on Document.DocumentId = Invoice.DocumentId
where Invoice.DocumentId is null
基本上我想要所有不是发票的文件,而是一些其他类型的文件,不管是什么。
非常感谢 LINQ 查询语法和 LINQ 方法(流畅)语法中的示例。
谢谢!
首先,即使在 SQL 中,该查询实际上应该是 not exists
,通常是 more efficient than the left join / is null
construct。
编译器也能更好地理解 exists
,因为它理解 not exists
不能向结果集添加更多行,因此它可以保留可能存在的任何唯一性保证。编译器没有看到带有 is null
检查的 left join
不能添加行(也许应该,但目前没有内置逻辑可以这样做)。
select Document.*
from Document
where not exists (select 1
from Invoice
where Document.DocumentId = Invoice.DocumentId);
现在很明显如何在 Linq 中做到这一点:
var docs =
from doc in Documents
where !Invoices.Any(inv => doc.DocumentId == inv.DocumentId);
var docs =
Documents
.Where(doc => !Invoices.Any(inv => doc.DocumentId == inv.DocumentId));
如何在 LINQ 中将 LEFT OUTER JOIN 写入 SQL,其中右侧为空?
我想要的结果的图形表示是这样的:
图片来源 Jeff Atwood.
以此SQL为例:
select Document.*
from Document left outer join Invoice
on Document.DocumentId = Invoice.DocumentId
where Invoice.DocumentId is null
基本上我想要所有不是发票的文件,而是一些其他类型的文件,不管是什么。
非常感谢 LINQ 查询语法和 LINQ 方法(流畅)语法中的示例。
谢谢!
首先,即使在 SQL 中,该查询实际上应该是 not exists
,通常是 more efficient than the left join / is null
construct。
编译器也能更好地理解 exists
,因为它理解 not exists
不能向结果集添加更多行,因此它可以保留可能存在的任何唯一性保证。编译器没有看到带有 is null
检查的 left join
不能添加行(也许应该,但目前没有内置逻辑可以这样做)。
select Document.*
from Document
where not exists (select 1
from Invoice
where Document.DocumentId = Invoice.DocumentId);
现在很明显如何在 Linq 中做到这一点:
var docs =
from doc in Documents
where !Invoices.Any(inv => doc.DocumentId == inv.DocumentId);
var docs =
Documents
.Where(doc => !Invoices.Any(inv => doc.DocumentId == inv.DocumentId));