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

时间:2010-08-19 15:09:53

标签: 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的规范使用?

1 个答案:

答案 0 :(得分:3)

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