2013-11-25 30 views
2

所以我有一個類似的方法:你可以傳入一個Expression <Func <T, bool>>謂詞到一個linq Where語句中嗎?

public List<T> SomeFunction(Expression<Func<T, bool>> predicate) { 
    return someList.Where(predicate).ToList(); 
} 

此代碼是不是可編譯,因爲我不能在謂詞傳遞到LINQ Where語句。有沒有辦法改變謂詞,以便與linq一起使用?

+0

我認爲你需要方法的簽名更改爲'公共列表 SomeFunction (表達>謂語)' – Muctadir

+0

你可以通過'表達> predicate'到LINQ'where' for'IQueryable' – Grundy

回答

4

如果使用Enumerable.Where方法,那麼你需要編譯你的表達

public List<T> SomeFunction(Expression<Func<T, bool>> predicate) { 
    return someList.Where(predicate.Compile()).ToList(); 
} 

也想想你是否真的需要在這裏使用的表達。你可以簡單地傳遞Func<T, bool>

+1

最好注意,在調用頻繁的情況下,predicate.Compile()將會帶來性能。我認爲,OP不理解'Expression '和'SomDelegate'之間的區別。 – Dennis

+0

@Dennis就我所知,Expression的設計主要是爲了提供一些方法將表達式從客戶端傳送到服務器,然後評估表達式並返回結果。在這種情況下,'Compile()'只返回一個普通的委託,所以它比一個普通的'Func <...>'更好嗎?我知道'編譯'這個詞可能會讓很多人感到困惑,我們知道每個**編譯的東西**會更快,但是在這種情況下,'Compile()'只是一種將表達式轉換爲可執行形式(委託) 。 –

+0

@KingKing:表達式是將代碼表示爲樹的方式。這是他們的目的。在n層解決方案中將表達式從客戶端傳輸到服務器只是一個應用程序示例(而不是主要的)。你的評論的另一部分應該寫給OP,因爲我不明白,你想向我解釋什麼?我知道,Expression.Compile'做了什麼,我正在試圖警告OP,它會導致性能下降。 – Dennis

相關問題