3

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

这是怎么回事?我如何定义一个可以同时作为 IEnumerable 和 IQueryable 规范的 Func?

4

1 回答 1

3

IQueryable的 LINQ 方法采用Expression Trees,而不是普通的委托。

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

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

要将相同的变量与 an 一起使用IEnumerable<T>,您需要调用AsQueryable()or Compile(),如下所示:

IQueryable<Foo> superFoos = foos.AsQueryable().Where(IsSuperhero);
IEnumerable<Foo> superFoos = foos.Where(IsSuperhero.Compile());
于 2010-08-19T15:12:02.987 回答