在LINQ查询中使用Func <>

乔纳森·伍德

我有一个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”。

问题:

  1. 为什么这些陈述如此不同,以至于我的陈述Func<>中有一项是合法的,而另一项却不合法?我以为他们基本上都做同样的事情。

  2. 我该如何工作?我是否必须明确地创建我自己Func<>Expression<Func<>>替代品?

在LINQ查询使用Expression <Func <>>看到我的相关问题

谢尔盖·别列佐夫斯基(Sergey Berezovskiy)

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在LINQ查询中使用Expression <Func <>>

来自分类Dev

在实体框架查询中使用Func <>

来自分类Dev

在linq查询中使用子查询

来自分类Dev

使用MongoDB的Linq查询无法作为Func工作

来自分类Dev

在Linq to Entity中使用Func作为通用方法参数

来自分类Dev

Sqlalchemy 核心 - 在联合查询中使用 func.sum

来自分类Dev

在LINQ分组查询中使用严格类型

来自分类Dev

在映射中使用Linq查询

来自分类Dev

如何在Linq查询中使用.ToList()?

来自分类Dev

在Linq查询中使用<T>(T obj)

来自分类Dev

在Linq查询中使用条件if语句

来自分类Dev

在Tasks中使用LINQ查询min元素

来自分类Dev

在 Select linq 查询中使用 async/await

来自分类Dev

Linq - 在选择中使用查询作为函数

来自分类Dev

在 Linq 查询 EF Core 中使用 Like

来自分类Dev

在Lambda表达式中使用Func <T>并使用LinQ到实体

来自分类Dev

如何过滤简单的LINQ查询并在更复杂的LINQ查询中使用它

来自分类Dev

在另一个linq查询中使用结果linq查询

来自分类Dev

我可以在LINQ查询中使用扩展方法吗?

来自分类Dev

在多个条件和子查询中使用LINQ左联接

来自分类Dev

在LINQ中使用聚合查询进行自我联接

来自分类Dev

如何在linq查询中使用方法?

来自分类Dev

在C#中使用LINQ查询的奇怪结果

来自分类Dev

在Include语句中使用Where子句的Linq查询

来自分类Dev

我可以在LINQ to Entities查询中使用CAST吗?

来自分类Dev

如何在LINQ中使用谓词来查询CRM 2011

来自分类Dev

如何在linq查询中使用子字符串?

来自分类Dev

在LINQ查询中的模型值中使用列表

来自分类Dev

在ASP.NET MVC中使用SQL查询到LINQ