是否有直接的LINQ语法来查找集合B中不存在的集合A的成员?在SQL中我会写这个
SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL
答案 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;