2012-11-23 61 views
3

我有一些代碼根據用戶輸入動態地建立一些搜索標準,導致傳遞給LINQ .Where()方法的Expression<Func<T, bool>>。當輸入存在時它工作正常,但當輸入是而不是目前,我想創建一個簡單的'返回false';語句,以便不返回任何結果。如何使用C#表達式樹創建一個LINQ友好的'return false'表達式?

下面是我當前的嘗試,但是當它傳遞給.Where()方法時,它會引發NotSupportedException「未知的LINQ表達式'Block'。」

var parameter = Expression.Parameter(typeof(T), "x"); 
var falseValue = Expression.Constant(false); 
var returnTarget = Expression.Label(typeof (bool)); 

var returnFalseExpression = Expression.Block(Expression.Return(returnTarget, falseValue), Expression.Label(returnTarget, falseValue)); 
var lambdaExpression = Expression.Lambda<Func<T, bool>>(returnFalseExpression, parameter); 

我該如何構建一個可以被LINQ解釋的'return false'表達式?

回答

8
Expression<Func<T, bool>> falsePredicate = x => false; 
+1

謝謝,現在答案似乎很明顯。我曾嘗試這種方法,但得到了編譯器錯誤'帶聲明體的lambda表達式不能轉換爲表達式樹' - 我沒有意識到我需要做的就是省略大括號。 –

+0

@LeeD通常會仔細閱讀錯誤並嘗試理解其含義。 – svick

6

你可以把整個東西包裝在if-else表達式中嗎?

含義:

if input 
    return <your normal code> 
else 
    return false 

的回報是在表達式中隱含的;表達式的返回值將只是最後一個值。所以你可以嘗試:

Expression.Condition 
    (
     Expression.NotEqual(input, Expression.Constant("")), 
     normalSearchExpression, 
     Expression.Constant(false) 
    ) 

這就是假設normalSearchExpression也返回一個布爾。