加入表达式<func <t,bool>&gt;

时间:2015-09-04 09:21:47

标签: c# linq

我有一个表达式列表:

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

我需要在一个OR表达式上加入所有这些: 我试过这个:

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

由于未在InvalidOperationExceptionExpression<Boolean>

之间定义布尔运算符,它会抛出Expression<Func<T, bool>>

请帮忙吗?

1 个答案:

答案 0 :(得分: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);
        }