一尘不染

LINQ to Entities中的“ NOT IN”子句

c#

无论如何,我可以像在 Linq to Entities 中的SQL Server中那样创建not in子句吗?


阅读 229

收藏
2020-05-19

共1个答案

一尘不染

如果您使用内存中的集合作为过滤器,则最好使用对Contains()的求反。请注意,如果列表太长,此操作可能会失败,在这种情况下,您将需要选择其他策略(有关为完全面向DB的查询使用策略的信息,请参见下文)。

   var exceptionList = new List<string> { "exception1", "exception2" };

   var query = myEntities.MyEntity
                         .Select(e => e.Name)
                         .Where(e => !exceptionList.Contains(e.Name));

如果您要排除基于另一个数据库的查询,使用Except可能是一个更好的选择。(此处是指向 LINQ to
Entities中受支持的Set扩展的链接

   var exceptionList = myEntities.MyOtherEntity
                                 .Select(e => e.Name);

   var query = myEntities.MyEntity
                         .Select(e => e.Name)
                         .Except(exceptionList);

这假设一个复杂的实体,其中您要根据另一个表的某些属性排除某些实体,并希望不排除这些实体的名称。如果需要整个实体,则需要将异常构造为实体类的实例,以使它们满足默认的相等运算符(请参阅docs)。

2020-05-19