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