2010-08-19 63 views
3

我有一個函數功能定義如下:需要Func鍵提供給凡()方法都IEnumerable和IQueryable的

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的規範?

回答

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

但後來我無法用它查詢IEnumerables!當然,我必須有一種方法可以在兩者上使用相同的規格? – David 2010-08-19 15:14:05

+0

哦,謝謝你的回答! – David 2010-08-19 15:15:56

+0

好的,謝謝 - 但Linq的API真是太遺憾了。 – David 2010-08-19 15:16:58

相關問題