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

标签 c# linq functional-programming specification-pattern

我有一个 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 的规范?

最佳答案

IQueryable的 LINQ 方法采用 Expression Trees ,不是普通代表。

因此,您需要更改您的 func变量为 Expression<Func<Foo, bool>> ,像这样:

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());

关于c# - 需要 Func 提供给 IEnumerable 和 IQueryable 的 Where() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523204/

相关文章:

c# - 在属性中使用 Func<T> 而不是简单 T 的原因可能是什么

c# - 我如何知道我的电子邮件是否已被接收并使用 Asp.net 阅读

c# - 将基于 2D Tile 的形状转换为简化的多边形

linq - ReSharper LINQ 扩展方法格式化

haskell - 将语义应用于自由单子(monad)

c# - 以编程方式重置 Windows XP 空闲时间

c# - Linq 进入数组,然后在数组中查找值并列表到组合框

c# - 我如何将 Linq var 转换为列表

java - 如何在 Java 8 中检查 Stream<String> 是否包含另一个 Stream<String>

Haskell - 由于我不明白的原因,非穷举模式