0

我正在尝试找到一种方法来实现以下形式的 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)
    ));

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

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

4

3 回答 3

0

我不确定这是否可行,但也许尝试使用and的连接List<int> IDsMyEntities entities

于 2011-05-17T04:46:32.187 回答
0

我最终找到了一种方法来做到这一点,但它在 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)
)); 

回到绘图板。

于 2011-05-17T05:18:37.163 回答
0

你不能。

做什么CompiledQuery?它将查询预转换为规范命令树——提供者用来生成 SQL 的中间表示。

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

您的 string/ |kludge 有效,因为您现在只将一个参数而不是列表传递给数据库服务器。但正如你所见,服务器无法索引这样的查询,所以它会很慢。

于 2011-05-18T18:58:48.050 回答