我正在尝试使用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.Contains
或WHERE ... IN
类型功能的任何方法?
答案 0 :(得分:6)
我怀疑在为非编译查询生成的SQL中,它正在使用
WHERE someTable.Field1 In (?, ?, ?)
表示三个值,例如......而不是fncCSVToTable
函数。
现在,编译查询的一部分是提前计算出SQL ...在这里,确切的SQL将取决于列表中的项目数(因为它需要那么多的查询参数)。我怀疑它让它变得非常尴尬,以至于它不受支持。