public static Expression <Func <T, bool> > Or <T>( this Expression <Func <T, bool> > one, Expression <Func <T, bool> > another) { var candidateExpr = Expression.Parameter(typeof(T), "candidate"); var parameterReplacer = new ParameterReplacer(candidateExpr); var left = parameterReplacer.Replace(one.Body); var right = parameterReplacer.Replace(another.Body); var body = Expression.Or(left, right); return(Expression.Lambda <Func <T, bool> >(body, candidateExpr)); }
public static Expression <Func <T, bool> > And <T>(this Expression <Func <T, bool> > one, Expression <Func <T, bool> > other) { // 首先定义好一个ParameterExpression var parameterExp = Expression.Parameter(typeof(T), "candidate"); var parameterReplacer = new ParameterReplacer(parameterExp); // // 将表达式树的参数统一替换成我们定义好的candidateExpr (表达式分为 参数和body,将参数统一成一个对象) var left = parameterReplacer.Replace(one.Body); var right = parameterReplacer.Replace(other.Body); var combindBody = Expression.And(left, right); return(Expression.Lambda <Func <T, bool> >(combindBody, parameterExp)); }