using System; using System.Linq.Expressions; namespace IRaCIS.Infra.Data.ExpressionExtend { /// /// 合并表达式 And Or Not扩展 /// public static class ExpressionExtend { /// /// 合并表达式 expr1 AND expr2 /// /// /// /// /// public static Expression> And(this Expression> expr1, Expression> expr2) { if (expr1 == null) return expr2; else if (expr2 == null) return expr1; //return Expression.Lambda>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters); ParameterExpression newParameter = Expression.Parameter(typeof(T), "c"); NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter); var left = visitor.Replace(expr1.Body); var right = visitor.Replace(expr2.Body); var body = Expression.And(left, right); return Expression.Lambda>(body, newParameter); } /// /// 合并表达式 expr1 or expr2 /// /// /// /// /// public static Expression> Or(this Expression> expr1, Expression> expr2) { if (expr1 == null) return expr2; else if (expr2 == null) return expr1; ParameterExpression newParameter = Expression.Parameter(typeof(T), "c"); NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter); var left = visitor.Replace(expr1.Body); var right = visitor.Replace(expr2.Body); var body = Expression.Or(left, right); return Expression.Lambda>(body, newParameter); } public static Expression> Not(this Expression> expr) { if (expr == null) return null; var candidateExpr = expr.Parameters[0]; var body = Expression.Not(expr.Body); return Expression.Lambda>(body, candidateExpr); } } }