需要 Func 提供给 IEnumerable 和 IQueryable 的Where()方法

发布于 2024-09-15 15:15:05 字数 471 浏览 3 评论 0 原文

我有一个 Func 定义如下:

Func<Foo, bool> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;

我可以像这样查询 IEnumerables:

IEnumerable<Foo> foos = GetAllMyFoos();
var superFoos = foos.Where(IsSuperhero);

但是当我尝试向 IQueryable 的Where 方法提供相同的 Func 时,我得到:

'无法将源类型 System.Collections.Generic.IEnumerable 转换为 System。 Linq.IQueryable。'

这是怎么回事?如何定义一个 Func 来作为 IEnumerable 和 IQueryable 的规范?

I have a Func defined as follows:

Func<Foo, bool> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;

I can query IEnumerables like this:

IEnumerable<Foo> foos = GetAllMyFoos();
var superFoos = foos.Where(IsSuperhero);

But when I try to supply the same Func to the Where method of an IQueryable, I get:

'Cannot convert source type System.Collections.Generic.IEnumerable to System.Linq.IQueryable.'

What's going on? How can I define a Func which will work as a specification for both IEnumerable and IQueryable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怪异←思 2024-09-22 15:15:05

IQueryable 的 LINQ 方法采用 表达式树,不是普通代表。

因此,您需要将 func 变量更改为 Expression>,如下所示:

Expression<Func<Foo, bool>> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;

要将同一变量与 IEnumerable< ;T>,您需要调用 AsQueryable()Compile(),如下所示:

IQueryable<Foo> superFoos = foos.AsQueryable().Where(IsSuperhero);
IEnumerable<Foo> superFoos = foos.Where(IsSuperhero.Compile());

IQueryable's LINQ methods take Expression Trees, not normal delegates.

Therefore, you need to change your func variable to an Expression<Func<Foo, bool>>, like this:

Expression<Func<Foo, bool>> IsSuperhero = x => x.WearsUnderpantsOutsideTrousers;

To use the same variable with an IEnumerable<T>, you'll need to call AsQueryable() or Compile(), like this:

IQueryable<Foo> superFoos = foos.AsQueryable().Where(IsSuperhero);
IEnumerable<Foo> superFoos = foos.Where(IsSuperhero.Compile());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文