static LambdaExpression InternalAndOrExpression(bool condition, LambdaExpression exp1, LambdaExpression exp2, bool isAndAlso)
        {
            if (condition == false)
            {
                return(exp1);
            }
            if (exp1 == null)
            {
                return(exp2);
            }
            if (exp2 == null)
            {
                return(exp1);
            }

            var newParameters = exp1.Parameters.Select((a, b) => Expression.Parameter(a.Type, $"new{b}")).ToArray();

            var left  = new NewExpressionVisitor(newParameters, exp2.Parameters.ToArray()).Replace(exp1.Body);
            var right = new NewExpressionVisitor(newParameters, exp2.Parameters.ToArray()).Replace(exp2.Body);
            var body  = isAndAlso ? Expression.AndAlso(left, right) : Expression.OrElse(left, right);

            return(Expression.Lambda(exp1.Type, body, newParameters));
        }
Beispiel #2
0
        /// <summary>
        /// 使用 or 拼接两个 lambda 表达式
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="exp1"></param>
        /// <param name="condition">true 时生效</param>
        /// <param name="exp2"></param>
        /// <returns></returns>
        public static Expression <Func <T, bool> > Or <T>(this Expression <Func <T, bool> > exp1, bool condition, Expression <Func <T, bool> > exp2)
        {
            if (condition == false)
            {
                return(exp1);
            }
            if (exp1 == null)
            {
                return(exp2);
            }
            if (exp2 == null)
            {
                return(exp1);
            }

            ParameterExpression  newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor      = new NewExpressionVisitor(newParameter, exp2.Parameters.FirstOrDefault());

            var left  = visitor.Replace(exp1.Body);
            var right = visitor.Replace(exp2.Body);
            var body  = Expression.OrElse(left, right);

            return(Expression.Lambda <Func <T, bool> >(body, newParameter));
        }