我的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的规范使用?
答案 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());