gpt4 book ai didi

c# - 'LINQ to Entities 不支持 LINQ 表达式节点类型 'Invoke'' 当 lambda 作为参数传递时,但不直接使用时

转载 作者:行者123 更新时间:2023-11-30 15:15:14 26 4
gpt4 key购买 nike

在任何人投票将其作为 this 的副本关闭之前, this和许多其他类似的问题,请仔细阅读问题,因为我不认为它是(即使它看起来非常相似)。

我有一个 Linq 查询如下...

List<int> ids = ctx
.Where(a => a.PartInformationTypeID == pitID && vals.Contains(a.PartDefinitionID))
.Select(a => a.SystemID)
.Distinct()
.ToList();

...哪里pitID是一个 intvalsList<int>

这很好用,但是因为我有四个这样的查询,只是在 Where 中的 lambda 有所不同。子句,我认为将代码拉出到通用方法中会更好...

private List<int> DoAdvancedSearch(Func<MyType, bool> p)
{
return ctx
.Where(a => p(a))
.Select(a => a.SystemID)
.Distinct()
.ToList();
}

然后我可以这样调用它......

List<int> ids = DoAdvancedSearch(systemIDs,
a => a.PartInformationTypeID == pitID && vals.Contains(a.PartDefinitionID))

但是,此方法给出运行时异常“System.NotSupportedException: 'LINQ to Entities 不支持 LINQ 表达式节点类型'Invoke'。'

在阅读了大量具有相同异常的其他问题后,我设法通过如下更改方法来解决它...

private List<int> DoAdvancedSearch(Expression<Func<MyType, bool>> p)
{
return ctx
.Where(p)
.Select(a => a.SystemID)
.Distinct()
.ToList();
}

但是,我似乎找不到的一件事是为什么我上面的第一个查询(在 Where 子句中使用 lambda)没有工作,而提取的第二个查询方法呢?我认为这不是实际 lambda 的问题,因为它不包含任何 EF 无法转换为 SQL 的内容(它在第一个版本中显然是这样做的),所以这显然与以下事实有关lambda 作为 Func 传递而不是 Expression .

我发现最接近解释的是对 this question 的回答。 ,但这是基于无法将传入的代码转换为 SQL 的事实。正如我所说,我认为这不是这里的问题,因为 EF 设法在第一个代码片段中很好地翻译了它。

任何人都能够解释为什么我的示例不适用于Func

作为次要问题,任何人都能够解释为什么 .Where(a => p(a))p 上给出了“应为方法名称”的编译器错误, 但对 .Where(p) 没问题?我认为这些是等价的。

谢谢

最佳答案

一个表达式对象被编译成一个数据结构(表达式树)。这在运行时由 EF 转换为 SQL 代码。另一方面,Func 由编译器转换为可执行的 IL 代码。当您要求 EF 翻译包含 Where(x => f(x)) 的查询时,您有一个 Func f(它是 IL 代码)和围绕它的一个小表达式树,描述了对 f 表示的函数的调用。错误消息是说这个“Invoke”表达式树无法转换为 SQL,这是合理的,因为正在调用的是一段 IL 代码。

请注意,在 Where 调用是内联的第一个示例中,您使用的是表达式,而不是 Func。这是因为C#中的lambda表达式可以有两种类型,而在IQueryable上使用Where扩展方法时,参数是Expression类型,因此整个lambda被编译成一棵表达式树。

关于c# - 'LINQ to Entities 不支持 LINQ 表达式节点类型 'Invoke'' 当 lambda 作为参数传递时,但不直接使用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52803576/

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