2013-02-23 119 views
3

我想擴展我的方法中的表達式參數以添加我自己的過濾器。我試圖做類似以下,但語法是錯誤的:如何在lambda表達式參數中擴展謂詞

public static IList<MyPage> DoSomething<T>(Expression<Func<T, bool>> predicate) 
{ 
    return DataStore().GetPages().Where(p => p.PublishDate < DateTime.Now && predicate) 
} 

編譯器抱怨在Visual Studio 2012是抱怨與此錯誤:

Error 29 Operator '&&' cannot be applied to operands of type ' bool ' and ' System.Linq.Expressions.Expression<System.Func<T,bool>> '

將延長謂語第一個會更好那麼回饋如果回.Where(predicate)?你會怎麼做?

+0

我想'GETPAGES()'返回'IQueryale ',對吧? – svick 2013-02-23 09:50:39

+0

是的,它確實返回IQueryable – TruMan1 2013-02-23 09:52:57

+0

對不起實際返回IList – TruMan1 2013-02-23 10:16:16

回答

4

Would extending the predicate first be better then feed if back as .Where(predicate)? How would you do that?

是的,正是這樣,如果我明白你的建議是正確的。你可以鏈.Where()這樣的:

public static IList<MyPage> DoSomething<T>(Expression<Func<T, bool>> predicate) 
{ 
    return DataStore().GetPages().Where(p => p.PublishDate < DateTime.Now).Where(predicate); 
} 
+0

是的,在這個特定的情況下(把AND謂詞放在一起),這是最好的選擇。 ORing需要類似'PredicateBuilder'的東西。 – svick 2013-02-23 09:56:06

+0

編譯錯誤,當我嘗試的是:'PagesFacade.Where(System.Func )'的最佳重載方法匹配有一些無效的參數。 – TruMan1 2013-02-23 09:57:31

+0

@svick爲了完整性,可以使用'.Union()'進行ORing,但是當它被轉換爲SQL並且查詢變得足夠複雜時,它可能會比真正的OR差得多。 – hvd 2013-02-23 09:57:41