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

AJ.*_*AJ. 2 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))
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 6

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

WHERE someTable.Field1 In (?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

对于三个值,例如......而不是fncCSVToTable函数.

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