2015-09-04 75 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); 
     } 
相关问题