Linq 左连接,其中 right 为空

Nic*_*obs 3 .net c# linq linq-to-sql

linq 相对较新,来自 SQL。所以,我试图找出以下的左连接:

SELECT * from MASTER m
LEFT JOIN CHILD C
    ON m.ID=C.MASTER_ID
WHERE C.MASTER_ID is null
Run Code Online (Sandbox Code Playgroud)

所以,通常这会返回 Master 没有孩子的所有记录。我发现了 .DefualtIfEmpty() 但这并没有消除有孩子的主记录。

我从以下方面着手:

var recs=from m in MASTER
         from c in child
             .where (mapping=>mapping.MasterId == m.Id)
             .DefaultIfEmpty()
         select new { MasterId = m.Id};
Run Code Online (Sandbox Code Playgroud)

但这就是我得到的并被卡住了。我假设 .DefaultIfEmpty() 不是我要找的。注意:主表中有几百万行。孩子们的数量接近相同。我之所以提到,是因为拉回所有记录等效率不高。理想情况下,生成的 SQL 将类似于我发布的 SQL。

谢谢大家。

oct*_*ccl 6

如果您使用的是 EF,那么您可以使用代表子级的导航属性获取没有子级的母版:

var result= from m in MASTER
            where m.Children.Count()==0// or m.Any()
            select m;
Run Code Online (Sandbox Code Playgroud)

如果你想在 linq 中使用显式连接来做到这一点,你可以试试这个:

var recs=from m in MASTER
         join c in child on m.Id equals C.MasterId into gj
         where gj.Count()==0 // or gj.Any()
         select m;
Run Code Online (Sandbox Code Playgroud)