我有两个集合,在两个集合中都有属性 Email
. 我需要获取第一个列表中的项目列表,其中 Email
在第二个列表中不存在 . 使用SQL我只会使用"not in",但我不知道LINQ中的等价物 . 怎么做的?
到目前为止,我有一个加入,像......
var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };
但我不能加入,因为我需要差异,加入会失败 . 我需要一些使用Contains或Exists的方法我相信 . 我还没有找到一个例子来做到这一点 .
15 回答
我不知道这对你有帮助,但是......
来自The NOT IN clause in LINQ to SQL by Marco Russo
你想要Except运算符 .
这里有更好的解释:http://blogs.msdn.com/charlie/archive/2008/07/12/the-linq-set-operators.aspx
NOTE: 此技术仅适用于基本类型,因为您必须实现IEqualityComparer以使用具有复杂类型的Except方法 .
对于以一组内存中对象开头并且正在查询数据库的人,我发现这是最好的方法:
这在SQL中产生了一个很好的
WHERE ... IN (...)
子句 .您可以使用Where和Any的组合来查找不在:
您可以将这两个集合放在两个不同的列表中,例如list1和list2 .
然后就写
这会奏效 .
在使用ADO.NET Entity Framework的情况下,EchoStorm的解决方案也可以完美运行 . 但我花了几分钟时间绕过它 . 假设您有一个数据库上下文dc,并希望在表x中找不到表y中未链接的行,则完整的答案答案如下所示:
回答Andy的评论,是的,在LINQ查询中可以有两个来自 . 这是一个完整的工作示例,使用列表 . 每个类Foo和Bar都有一个Id . Foo有一个“外键”引用Bar via Foo.BarId . 程序选择未链接到相应Bar的所有Foo .
虽然
Except
是答案的一部分,但并不是完整的答案 . 默认情况下,Except
(与几个LINQ运算符一样)对引用类型进行引用比较 . 要按对象中的值进行比较,您必须这样做在您的类型中实现
IEquatable<T>
,或在您的类型中覆盖
Equals
和GetHashCode
,或传入为您的类型实现
IEqualityComparer<T>
的类型的实例为简单起见,使用List of int的示例 .
对于那些也想在C#中使用类似SQL的
IN
运算符的人,请下载此包:它有
In
和NotIn
方法:即使你可以这样使用它
人们也可以使用
All()
谢谢你,布雷特 . 你的建议对我也有帮助 . 我有一个对象列表,并希望使用另一个对象列表来过滤它 . 再次感谢....
如果有人需要,请查看我的代码示例:
我没有用LINQ to Entities测试这个:
或者:
你不能做一个外连接,只有当组是空的时才从第一个列表中选择项目吗?就像是:
我不确定这是否会以任何有效的方式与Entity框架一起工作 .