简体   繁体   English

联接表达 <Func<T,bool> &gt;

[英]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: 我需要将所有这些都加入一个OR表达式中:我已经尝试过了:

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>> 由于在Expression<Boolean>Expression<Func<T, bool>>之间未定义布尔运算符,因此抛出InvalidOperationException

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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