Entity Framework - 使用 IN Clause 属性

42

我需要使用“普通”的WHERE和IN子句,通过各种字段在我的数据库查询中过滤一些实体,但我不知道如何在EF中实现。

这是方法:

数据库表

Licenses
-------------
license INT
number INT
name VARCHAR
...

在EF中所需的SQL查询

SELECT * FROM Licenses WHERE license = 1 AND number IN (1,2,3,45,99)

EF代码

using (DatabaseEntities db = new DatabaseEntities ())
{
    return db.Licenses.Where(
        i => i.license == mylicense 
           // another filter          
        ).ToList();
}

我尝试过使用ANY和CONTAINS,但我不知道如何在EF中实现。

如何在EF中执行此查询?


你说得对,由于匆忙我没有写那段代码。 - unairoldan
可能是如何在实体框架中执行“in”查询?的重复问题。 - Alex Angas
1个回答

90
int[] ids = new int[]{1,2,3,45,99};
using (DatabaseEntities db = new DatabaseEntities ())
{
    return db.Licenses.Where(
        i => i.license == mylicense 
           && ids.Contains(i.number)
        ).ToList();
}

应该能够正常工作


1
谢谢!我尝试了相反的方法:i.number.Contains(...)。我都快疯了... - unairoldan
1
@Sprague,当您使用IQueryable时,您的代码被编译成表达式树而不是准备运行的IL代码。EF分析表达式树并在运行时将其转换为SQL查询。 即使对于简单的查询,也需要进行黑魔法才能实现此操作,这里的“contains”技巧并不比EF提供程序可以识别和转换为SQL查询的任何其他模式更特殊。 - Albin Sunnanbo
3
ids包含大量元素时,ids.Contains(i.number)不是一个好的选择。EF会将其转换为...WHERE (1=number) AND(2=number) AND(3=number) AND (45=number) AND…,这种转换方式在有10,000个元素时非常糟糕。 - Salem
5
@Salem 你为什么这么想?绝对不是ANDOR是一种可能性,但被翻译成了 number in (1,2,3,45,99)。虽然在EF5及之前的版本中,内部代码不能高效处理超过1000个项目,但是从EF6开始已经解决了这个问题。我有一个包含10000个项目的查询,在EF6.1中只需要约70毫秒的时间。虽然不是非常快(它是一个非常大的查询需要解析和执行),但也并不特别慢。 - Albin Sunnanbo
1
这是正确的,Albin Sunnanbo。它是一个“或”条件。我正在使用EF4,当我实现List Contain时,它是一场灾难。为了解决这个问题,有时我会编写像这样的SQL查询:contxt.MyEntitySet.SqlQuery("SELECT... WHERE myCol IN ('" + string.Join("','", intersecList) + "')") - Salem
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接