2015-06-18 38 views
2

我要過濾的IEnumerable<ModuleItem>由凡由用戶定義的調用(這樣的表達是通過一個String對象給出)動態拉姆達包裹着嘗試捕捉

到目前爲止,我可以創造我的過濾器與DynamicLinq與此代碼

Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null); 

問題是如果集合中的某個項目的評估失敗,則整體篩選將失敗。所以我想在lambda中捕獲異常,並返回false來過濾出失敗的項目。

我試着用TryExpression.TryCatch(...)包裝的表達,但我不能回去的Expression<Func<ModuleItem, bool>>

我如何包裝我的動態表達,並取回一個Expression<Func<ModuleItem, bool>>對象作爲參數在哪裏使用?

+1

你有一個'IEnumerable',而不是一個'IQueryable',那你爲什麼處理表達式,而不僅僅是代表,首先呢? – Servy

+0

您需要一個帶有return語句的塊。 – SLaks

+0

我並不在乎它是表達式還是塊。我的約束是獲得一個表達式作爲一個字符串,並將其提供給一個IEnumerable.Where調用。 – Max

回答

1

經過一些嘗試,我得到了這個工作。 解決方法是使用trycatch來包裝表達式的主體,而不是表達式本身,然後使用表達式參數來創建結果lambda。

否則我得到了類似的信息(不知道有)一個Func<ModulelItem, bool, bool>

所以最終的代碼是

Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null); 
Expression triedExpr = TryExpression.TryCatch(expr.Body, Expression.Catch(typeof(Exception), Expression.Constant(false))); 
Func<ModuleItem, bool> whereDelegate = Expression.Lambda<Func<ModuleItem, bool>>(triedExpr, expr.Parameters).Compile(); 
+0

需要刪除最後一行代碼示例中的多餘括號 – dizarter

+0

感謝您對我編輯代碼的更正。 – Max