Linq-to-Entities匹配编译查询中的整数列表中的ID

时间:2011-05-17 03:51:21

标签: entity-framework linq-to-entities compiled-query

我正在尝试找到一种方法来实现以下形式的Linq-to-Entities编译查询:

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.Compile,所以上述失败。我试图找到一些聪明的方法将逗号分隔的整数列表作为字符串传递,并在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)
    ));

但由于不支持的分割功能,这不起作用。

关于如何实施这一点的任何聪明的想法?

3 个答案:

答案 0 :(得分:0)

我不确定这是否可行,但可能尝试使用List<int> IDsMyEntities entities加入

答案 1 :(得分:0)

我最终找到了一种方法来做到这一点,但它在3s左右的时候太慢了。

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)
)); 

回到绘图板。

答案 2 :(得分:0)

你不能。

CompiledQuery做什么?它将查询预转换为规范命令树 - 用于由提供程序生成SQL的中间表示。

无论param值如何,带有标量参数的命令的SQL都是相同的结构。但是,为2个项目列表生成的SQL将与SQL结构上的结构不同对于3个项目的列表,因为它在{{1}中需要少一个OR谓词子句。毕竟,大多数数据库服务器都不会将列表作为参数值。

您的字符串/ WHERE kludge有效,因为您现在只将一个参数(而不是列表)传递给数据库服务器。但正如您所见,服务器无法索引此类查询,因此速度很慢。