我正在尝试使用 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.Contains
or WHERE ... IN
L2E CompiledQuery 中的类型功能?
我怀疑在为非编译查询生成的 SQL 中,它使用
WHERE someTable.Field1 In (?, ?, ?)
例如,对于三个值...而不是fncCSVToTable
功能。
现在,编译查询的部分目的是提前计算出 SQL...这里,确切的 SQL 将取决于列表中的项目数量(因为它将需要那么多查询参数)。我怀疑这会让它变得很尴尬,因为它不被支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)