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(),但没有一个例子是足够接近的。

SQL ';not in ';实体框架4.1的语法

试一试…

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