【问题标题】:SQL "not in" syntax for Entity Framework 4.1Entity Framework 4.1 的 SQL“不在”语法
【发布时间】:2011-08-24 21:17:19
【问题描述】:

我对“不在”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(),但没有一个例子足够接近。

【问题讨论】:

  • +1 非常好,措辞得体的问题是您第一次在 Stack Overflow 上被问到。欢迎。

标签: c# sql asp.net-mvc-3 entity-framework-4.1


【解决方案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>)

分别。

【讨论】:

  • 这是完美的 - 工作没有打嗝!谢谢你的例子。
  • 这里的解释非常简洁。
  • 为什么'NOT ([Extent1].[ID] IN'和为什么不'([Extent1].[ID] NOT IN'?
  • @deathrace - SQL 输出用于参考可能从该 LINQ 查询生成的 sql 类型。它不是具体将生成什么,只是给出逻辑输出的粗略概念,而不是可能非常基于库版本/优化/自定义规则的特定输出。
【解决方案2】:

这需要你稍微向后思考。与其询问该值是否不在某个 id 列表中,不如询问某个 id 列表是否不包含该值。像这样

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

【讨论】:

    【解决方案3】:

    初学者试试这个...

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

    【讨论】:

      【解决方案4】:

      这可能是做你想做的事的一种方式:

      // 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 或更多...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2011-09-06
        • 2023-04-02
        • 2011-12-06
        • 1970-01-01
        相关资源
        最近更新 更多