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或更多…