实体框架 - 属性IN子句用法

una*_*dan 26 sql entity-framework entity-framework-5

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

这是方法:

数据库表

Licenses
-------------
license INT
number INT
name VARCHAR
...
Run Code Online (Sandbox Code Playgroud)

EF中所需的SQL查询

SELECT * FROM Licenses WHERE license = 1 AND number IN (1,2,3,45,99)
Run Code Online (Sandbox Code Playgroud)

EF代码

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

我尝试过ANY和CONTAINS,但我不知道如何用EF做到这一点.

如何在EF中执行此查询?

Alb*_*nbo 58

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();
}
Run Code Online (Sandbox Code Playgroud)

应该管用

  • 当`ids`包含大量元素时,`ids.Contains(i.number)`不好.EF将其转换为`... WHERE(1 =数字)AND(2 =数字)AND(3 =数字)AND(45 =数字)AND ...`.10.000元素真的很糟糕 (2认同)
  • @Salem是什么让你这么想的?绝对不是'AND`,`OR`是可能的,但它被翻译成`(1,2,3,45,99)`中的数字.虽然在EF5及更早版本中,内部代码的效率不高于1000个项目,但是来自固定的EF6.我有10000个项目的查询,在EF6.1中需要大约70毫秒.不是超级快(这是一个非常大的解析和执行查询),但也不是特别慢. (2认同)