SQL ';not in ';实体框架4.1的语法
本文关键字:语法 in not SQL 实体 框架 | 更新日期: 2023-09-27 18:06:30
我有一个简单的问题与实体框架语法的"不在" SQL等效。从本质上讲,我想将以下SQL语法转换为实体框架语法:
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<List> GetLists(List<int> listIDs)
{
using (dbInstance db = new dbInstance())
{
return db.Lists.Where(**** What Goes Here ****).ToList();
}
}
有没有人能给我一些关于Where
条款区域的指示?我读了一些关于这个的论坛,看到提到使用.Contains()
或.Any()
,但没有一个例子是足够接近的。
试一试…
public static List<List> GetLists(List<int> 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 (<your,list,of,ids>))
或
SELECT [Extent1].*
FROM [dbo].[List] AS [Extent1]
WHERE [Extent1].[ID] IN (<your,list,of,ids>)
。
这需要你稍微向后思考一下。而不是询问值是否不在某个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<int> or other =)
{
using (dbInstance db = new dbInstance())
{
return db.Lists.Where(m => !ids.Contains(m.ID));
}
}
然而,我发现这样做可能会在某些情况下引发错误,特别是当列表太大且连接速度较慢时。
请记住先检查其他所有内容,以便该过滤器可以检查的值更少。
还请记住,当您构建过滤器/查询时,Linq不会填充变量(至少在默认情况下不会)。如果要对每条记录进行迭代,请记住在此之前调用ToList()或ToArray()方法,除非每条记录有500MB或更多。