2013-07-11 45 views
1

我有兩種類型的表達式樹:Expression<Func<string, bool>>,我想要獲得一個表達式來執行兩個表達式的OR(將相同的字符串參數傳遞給兩個表達式) 任何想法?如何組合(或)兩個表達式樹

+0

我不確定你在這裏問什麼,也許你可以解釋爲什麼你問? – Bostwick

回答

1

您可以嘗試將它們組合在Expression.Lambda表達式中,然後使用Expression.Or來檢查它們中的一個是否爲真。

下面是一個例子:

Expression<Func<Car, bool>> theCarIsRed = c1 => c1.Color == "Red"; 
Expression<Func<Car, bool>> theCarIsCheap = c2 => c2.Price < 10.0; 
Expression<Func<Car, bool>> theCarIsRedOrCheap = Expression.Lambda<Func<Car, bool>>(
    Expression.Or(theCarIsRed.Body, theCarIsCheap.Body), theCarIsRed.Parameters.Single()); 
var query = carQuery.Where(theCarIsRedOrCheap); 

也許你可以得到更多的信息here

+1

這不起作用,因爲'theCarIsCheap'主體中使用的參數不再存在於結果表達式中。您需要使用ExpressionVisitor的漫長方式。 –

+0

我正在研究它,但鏈接確實值得閱讀。 – Dave

3

您可以使用PredicateBuilder from LINQKit做到這一點。例如:

Expression<Func<string, bool>> e1 = …; 
Expression<Func<string, bool>> e2 = …; 
Expression<Func<string, bool>> combined = e1.Or(e2).Expand(); 
+0

它的工作原理,但因爲我要在LinqToEntities查詢中將它與EF一起使用,所以我無法在其中使用Invoke。 – Dave

+0

@Dave這就是'Expand()'的用處,它負責處理'Invoke'。 – svick