如何在 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));