gpt4 book ai didi

linq - CompiledQuery 与 List.Contains (where...in list) 功能?

转载 作者:行者123 更新时间:2023-12-01 15:54:08 30 4
gpt4 key购买 nike

我正在尝试使用 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.ContainsWHERE ... IN L2E CompiledQuery 中的类型功能?

最佳答案

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

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

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

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

关于linq - CompiledQuery 与 List.Contains (where...in list) 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3787330/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com