2015-09-04 73 views
0

我有一個表達式列表:加入表達<Func<T,bool>>

List<Expression<Func<Domain.FollowUpActivity, bool>>> fuaExpressions = null; 

我需要加入所有的人都在單個或表達式: 我已經試過這樣:

Expression body = Expression.Constant(false); 
foreach (var orExpression in orExpressions) 
    foreach (Expression orExp in orExpression.Expressions) 
     body = Expression.Or(body, orExp); 

它拋出一個InvalidOperationException由於布爾運營商之間沒有定義Expression<Boolean>Expression<Func<T, bool>>

有些幫助嗎?

回答

0

從一個偉大的book通過阿爾巴哈利兄弟:

public static class PredicateBuilder 
{ 
    public static Expression<Func<T, bool>> True<T>() { return f => true; } 
    public static Expression<Func<T, bool>> False<T>() { return f => false; } 

    public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1, 
                 Expression<Func<T, bool>> expr2) 
    { 
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression>()); 
    return Expression.Lambda<Func<T, bool>> 
      (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters); 
    } 

    public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1, 
                 Expression<Func<T, bool>> expr2) 
    { 
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression>()); 
    return Expression.Lambda<Func<T, bool>> 
      (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); 
    } 
} 

使用方法如下:

List<Expression<Func<Domain.FollowUpActivity, bool>>> fuaExpressions = null; 
Expression<Func<Domain.FollowUpActivity, bool>> result = PredicateBuilder.False<Domain.FollowUpActivity>(); 
     foreach (var exp in fuaExpressions) 
     { 
      result = PredicateBuilder.Or(result, exp); 
     } 
相關問題