簡體   English   中英

聯接表達 <Func<T,bool> &gt;

[英]Join Expression<Func<T,bool>>

我有一個表達式列表:

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

由於在Expression<Boolean>Expression<Func<T, bool>>之間未定義布爾運算符,因此拋出InvalidOperationException

請幫忙嗎?

摘自阿爾巴哈里兄弟的一好書:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM