简体   繁体   中英

Join Expression<Func<T,bool>>

I've a list of expressions:

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

I need to join all of them on a single OR expression: I've tried this:

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

It throws me an InvalidOperationException due to boolean operator is not defined between Expression<Boolean> and Expression<Func<T, bool>>

Some help please?

From a great book by Albahari brothers:

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);
  }
}

Use it like this:

 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);
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM