我正在查找一個示例如何使用Telerik網格框架的特定部分(ASP.NET MVC3,但這不是真的在這裏相關)。他們有一段代碼,這需要過濾器說明的列表,並建立一個表達式:Linq表達式語法和編譯
System.Linq.Expressions.Expression<Func<MyModel, bool> exp =
ExpressionBuilder.Expression<MyModel>(listOfFilters);
好了,我覺得這很好。表達式包裝一個lambda,它在MyModel上運行以生成一個布爾值。大。現在,他們的例子只是下降到這一點,像這樣一個地方:
someList = someList.Where(exp);
對此我推測應該是「哎應用該表達列表中的所有項目(這當然是通用爲MyModel太)然而, VS聲稱代碼不能編譯,我得到「沒有超載存在或者System.Func有一些無效參數」
我玩弄了它,發現我可以編譯表達式,
someList = someList.Where(x => exp.Compile()(x));
哪個編譯和會pro可以工作,但這讓我感到不舒服,因爲我現在明顯在我所知道的範圍之外工作。
爲什麼(IDE設置,標誌,陳舊文檔)示例的方法不起作用有一些原因嗎? 對我的黑客和示例有一個粗略的等價關係嗎? 我應該以不同的方式構建該hack以避免一些可怕的問題(比如,它不會每次編譯表達式時都檢查表達式中的項目,對嗎?我認爲它足夠聰明)
- - 編輯 是的,它是IEnumerable。我陷入了「所有Wheres都是平等的」陷阱。 謝謝大家!
有趣。這也有用,所以我可以清理一下我的代碼。我想那個問題是爲什麼我需要這樣做呢? – Mikeb 2012-02-27 21:15:12
這是正確的。附註:這有可怕的表現,因爲編譯表達式非常昂貴。 – usr 2012-02-27 21:15:21
@Mikeb IEnumerable .Where()需要一個Func,而不是一個表達式,對吧?你的Expression.Compile正在生成一個Func - 這可能是它的原因。但是,鑑於Telerik示例中的用法,我會看看Telerik框架是否具有擴展方法。 –
2012-02-27 21:18:58