无论如何,我可以像在 Linq to Entities 中的SQL Server中那样创建not in子句吗?
如果您使用内存中的集合作为过滤器,则最好使用对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扩展的链接)
Except
var exceptionList = myEntities.MyOtherEntity .Select(e => e.Name); var query = myEntities.MyEntity .Select(e => e.Name) .Except(exceptionList);
这假设一个复杂的实体,其中您要根据另一个表的某些属性排除某些实体,并希望不排除这些实体的名称。如果需要整个实体,则需要将异常构造为实体类的实例,以使它们满足默认的相等运算符(请参阅docs)。