CompiledQuery with List.Contains(where ... in list)功能?

时间:2010-09-24 13:05:52

标签: linq linq-to-entities entity-framework-4

我正在尝试使用Linq-to-Entities编写CompiledQuery,它将替换采用两个数组(在本例中为逗号分隔的TEXT)参数的存储过程。从本质上讲,SQL就是这样的:

*Stored Proc definition*
@ArrayParm1    TEXT,
@ArrayParm2    TEXT
-- etc. 
SELECT [fieldList] 
FROM someTable
WHERE someTable.Field1 IN (SELECT * FROM dbo.fncCSVToTable(@ArrayParm1))
AND someTable.Field2 IN (SELECT * FROM dbo.fncCSVToTable(@ArrayParm2))

dbo.fncCSVToTable创建一个包含数组值的单列临时表。

将此转换为已编译的Linq-to-Entities查询似乎并不困难:

public static Func<EntityContext, List<int>, List<string> IQueryable<EntityType>>
    SomeQuery = 
        CompiledQuery.Compile((EntityContext context, List<int> arrayParm1, 
                               List<string> arrayParm2) =>
            from c in context.SomeTableEntities
            where arrayParm1.Contains(c.Field1)
                && arrayParm2.Contains(c.Field2)
            select new EntityType
            { 
                //projection
            });

但是,我收到运行时错误,指出Func<>的参数不能是List,并且只支持标量参数。这对我来说很有意义,但我仍然觉得必须有一种方法可以在编译的查询中执行此操作。有没有人知道在L2E CompiledQuery中做List.ContainsWHERE ... IN类型功能的任何方法?

1 个答案:

答案 0 :(得分:6)

我怀疑在为非编译查询生成的SQL中,它正在使用

WHERE someTable.Field1 In (?, ?, ?)

表示三个值,例如......而不是fncCSVToTable函数。

现在,编译查询的一部分是提前计算出SQL ...在这里,确切的SQL将取决于列表中的项目数(因为它需要那么多的查询参数)。我怀疑它让它变得非常尴尬,以至于它不受支持。