Entity framework Linq到实体匹配已编译查询中整数列表中的ID

Entity framework Linq到实体匹配已编译查询中整数列表中的ID,entity-framework,linq-to-entities,compiled-query,Entity Framework,Linq To Entities,Compiled Query,我试图找到一种实现Linq到实体编译查询的方法: Func<MyEntities, List<int>, IQueryable<MyClass>> query = System.Data.Objects.CompiledQuery.Compile( (MyEntities entities, List<int> IDs) => ( (from au in entities.Mine where IDs.Any(x =

我试图找到一种实现Linq到实体编译查询的方法:

Func<MyEntities, List<int>, IQueryable<MyClass>> query = System.Data.Objects.CompiledQuery.Compile(
    (MyEntities entities, List<int> IDs) => (
         (from au in entities.Mine where IDs.Any(x => x == au.ID) select au)
    ));
因为只有标量参数可以传递给CompiledQuery。编译上述参数失败。我试图找到一些聪明的方法,将逗号分隔的整数列表作为字符串传递,并在L2E查询中使用该字符串,如下所示:

Func<MyEntities, string, IQueryable<MyClass>> query = System.Data.Objects.CompiledQuery.Compile(
    (MyEntities entities, string IDs) => (
         (from au in entities.Mine where IDs.Split(',').Any(x => Convert.ToInt32(x) == au.ID) select au)
    ));
但由于Split函数不受支持,所以这不起作用


关于如何实现这一点,有什么好主意吗?

我不确定这是否可行,但可能尝试使用列表ID和MyEntities实体的联接?

我最终找到了一种方法,但在3秒左右时速度太慢了

string ids = "|" + String.Join("|", new List<int> { 4, 5, 6, 7, 8, 9, 10, 20, 23, 34 }) + "|";   

Func<MyEntities, string, IQueryable<MyClass>> query =     System.Data.Objects.CompiledQuery.Compile(
(MyEntities entities, string IDs) => (
     (from au in entities.Mine where IDs.Contains("|" + SqlFunctions.StringConvert((decimal)au.ID).Trim() + "|")select au)
)); 
回到绘图板上。

你不能

CompiledQuery做什么?它将查询预转换为规范的命令树,这是提供者用于生成SQL的中间表示形式

无论参数值是多少,具有标量参数的命令的SQL都是相同的结构。但是,为2项列表生成的SQL在结构上与为3项列表生成的SQL不同,因为它在WHERE子句中只使用一个OR谓词。毕竟,大多数DB服务器不会将列表作为参数值

字符串/| kludge可以工作,因为您现在只向DB服务器传递一个参数,而不是列表。但是正如您所看到的,服务器无法为这样的查询编制索引,因此速度会很慢