LINQ排除

时间:2009-02-03 15:10:13

标签: sql linq

是否有直接的LINQ语法来查找集合B中不存在的集合A的成员?在SQL中我会写这个

SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL

3 个答案:

答案 0 :(得分:11)

请参阅Except operator上的MSDN文档。

答案 1 :(得分:3)

我相信您的LINQ会如下所示。

var items = A.Except(
  from itemA in A
  from itemB in B
  where itemA.ID == itemB.ID
  select itemA);

更新

如评论中的Maslow所示,这可能不是最高效的查询。与任何代码一样,执行某种级别的分析以消除瓶颈和低效算法非常重要。在这种情况下,chaowman's answer会提供更好的效果。

通过对查询的一些检查可以看出原因。在我提供的示例中,A集合上至少有两个循环 - 1用于组合A和B列表,另一个用于执行Except操作 - 而在chaowman's answer中(下面再现) ,A集合只迭代一次。

// chaowman's solution only iterates A once and partially iterates B
var results = from itemA in A
              where !B.Any(itemB => itemB.Id == itemA.Id)
              select itemA;

另外,在我的回答中,对于A中的每个项目,B集合都是完整的迭代,而在chaowman's answer中,它只迭代到找到匹配的点。

正如您所看到的,即使在查看生成的SQL之前,您也可以从查询本身发现潜在的性能问题。再次感谢Maslow突出显示此内容。

答案 2 :(得分:3)

var results = from itemA in A
              where !B.Any(itemB => itemB.Id == itemA.Id)
              select itemA;