entity framework4.1的SQL“不在”语法

对于“not in”SQL等价物,我有一个简单的Entity Framework语法问题。 基本上,我想将以下SQL语法转换为Entity Framework语法:

select ID from dbo.List where ID not in (list of IDs) 

这是我用于查找单个记录的方法:

 public static List GetLists(int id) { using (dbInstance db = new dbInstance()) { return db.Lists.Where(m => m.ID == id); } } 

这是一个我想用于此的伪方法:

 public static List GetLists(List listIDs) { using (dbInstance db = new dbInstance()) { return db.Lists.Where(**** What Goes Here ****).ToList(); } } 

任何人都可以指出Where子句区域的内容吗? 我读了一些关于这个的论坛,并看到了使用.Contains().Contains()提及,但没有一个例子足够接近。

放手一搏……

 public static List GetLists(List listIDs) { using (dbInstance db = new dbInstance()) { // Use this one to return List where IS NOT IN the provided listIDs return db.Lists.Where(x => !listIDs.Contains(x.ID)).ToList(); // Or use this one to return List where IS IN the provided listIDs return db.Lists.Where(x => listIDs.Contains(x.ID)).ToList(); } } 

这些将变成大约以下数据库查询:

 SELECT [Extent1].* FROM [dbo].[List] AS [Extent1] WHERE NOT ([Extent1].[ID] IN ()) 

要么

 SELECT [Extent1].* FROM [dbo].[List] AS [Extent1] WHERE [Extent1].[ID] IN () 

分别。

这个要求你稍微思考一下。 而不是询问值是否在某些ID列表中,您必须要求某些ID列表不包含该值。 像这样

 int[] list = new int[] {1,2,3} Result = (from x in dbo.List where list.Contains(x.id) == false select x); 

尝试这个为初学者…

 m => !listIDs.Contains(m.ID) 

这可能是你想要的方式:

 // From the method you provided, with changes... public static List GetLists(int[] ids) // Could be List or other =) { using (dbInstance db = new dbInstance()) { return db.Lists.Where(m => !ids.Contains(m.ID)); } } 

但是我发现这样做可能会在某些情况下引发错误,特别是当列表太大而连接速度有点慢时。

请记住在之前检查其他所有内容,以便此filter可能具有较少的值来检查。

还要记住,在构建filter/查询时,Linq不会填充变量(至少在默认情况下不是这样)。 如果您要为每条记录进行迭代,请记住之前调用ToList()或ToArray()方法,除非每条记录都有500MB或更多…