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.Contains
或WHERE ... IN
输入功能?
我怀疑在为非编译查询生成的SQL中,它正在使用
WHERE someTable.Field1 In (?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
对于三个值,例如......而不是fncCSVToTable
函数.
现在,编译查询的一部分是提前计算出SQL ...在这里,确切的SQL将取决于列表中的项目数(因为它需要那么多的查询参数).我怀疑这让它变得尴尬,以至于它不受支持.
归档时间: |
|
查看次数: |
1151 次 |
最近记录: |