Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        //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));
        }