/// <summary> /// 逻辑运算(或) /// </summary> /// <param name="predicate">条件表达式</param> public void Or(Expression <Func <T, bool> > predicate) { ParameterExpression candidateExpr = Expression.Parameter(typeof(T), "candidate"); ParameterExpressionVisitor parameterVisitor = new ParameterExpressionVisitor(candidateExpr); Expression left = parameterVisitor.Visit(this._condition.Body); Expression right = parameterVisitor.Visit(predicate.Body); BinaryExpression body = Expression.Or(left, right); this._condition = Expression.Lambda <Func <T, bool> >(body, candidateExpr); }
//Private #region # 合并表达式 —— static Expression<TExpression> Merge<TExpression>(... /// <summary> /// 合并表达式 /// </summary> /// <typeparam name="TExpression">表达式类型</typeparam> /// <param name="left">左表达式</param> /// <param name="right">右表达式</param> /// <param name="operator">操作符</param> /// <returns>Lambda表达式</returns> private static Expression <TExpression> Merge <TExpression>(Expression <TExpression> left, Expression <TExpression> right, Func <Expression, Expression, Expression> @operator) { // zip parameters (map from parameters of right to parameters of left) IDictionary <ParameterExpression, ParameterExpression> map = left.Parameters .Select((expression, index) => new { expression, s = right.Parameters[index] }) .ToDictionary(p => p.s, p => p.expression); // replace parameters in the right lambda expression with the parameters in the left ParameterExpressionVisitor parameterExpressionVisitor = new ParameterExpressionVisitor(map); Expression rightBody = parameterExpressionVisitor.Visit(right.Body); // create a merged lambda expression with parameters from the left expression return(Expression.Lambda <TExpression>(@operator.Invoke(left.Body, rightBody), left.Parameters)); }