我有一个Func<ProductItemVendor, bool>
存储在CompareProductItemVendorIds
。我想在LINQ查询中使用该表达式。
看来以下是合法的:
var results =
Repository.Query<ProductItemVendor>().Where(CompareProductItemVendorIds);
但是,以下内容不合法:
var results = from v in Repository.Query<ProductItemVendor>()
where CompareProductItemVendorIds(v)
select v;
这段代码产生一个错误:
LINQ to Entities不支持LINQ表达式节点类型“ Invoke”。
问题:
为什么这些陈述如此不同,以至于我的陈述Func<>
中有一项是合法的,而另一项却不合法?我以为他们基本上都做同样的事情。
我该如何工作?我是否必须明确地创建我自己Func<>
的Expression<Func<>>
替代品?
请在LINQ查询中使用Expression <Func <>>看到我的相关问题。
Expression<Func<T,bool>>
和之间有很大差异Func<T,bool>
。第一个是表达式树。您可以将其视为代码描述。Linq to Entities需要表达式树。因为它需要建立SQL查询。因此,需要代码描述才能将相同的动作转换为SQL。
第二个Func<T,bool>
是具有指定签名的简单方法。这里没什么特别的。为什么在这里合法:
Repository.Query<ProductItemVendor>().Where(CompareProductItemVendorIds);
这很简单。有两种Where
扩展方法。一个前台IQueryable<T>
,期望表达式树(将被转换为SQL查询)。另一个是扩展,IEnumerable<T>
它期望使用序数方法进行内存中集合筛选(通常为C#代码)。因此,您没有表达式树,选择了后者。此处未生成SQL。这是你的情况。
现在第二个查询:
from v in Repository.Query<ProductItemVendor>()
where CompareProductItemVendorIds(v)
select v
其实不是同一查询。相当于
Repository.Query<ProductItemVendor>().Where(v => CompareProductItemVendorIds(v));
这里有lambda表达式,可以将其转换为表达式树。并且使用了另一个Where
扩展名-一个用于IQueryable<T>
。因此,Linq to Entities尝试将此表达式树转换为SQL。但是它应该转换什么呢?是的,调用某些内存方法。而且,当然,Linq to Entities无法做到这一点。
为了使查询有效,您应该使用Expression<Func<T,bool>>
。您可以手动构建它,也可以使用lambda表达式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句