主要内容摘自:https://stackoverflow.com/questions/6736505/how-to-combine-two-lambdas/6736589#6736589

假设我们的集合有两个动态条件:

Expression<Func<string, bool>> expr1 = s => s.Length == 5;
Expression<Func<string, bool>> expr2 = s => s == "someString";

我想动态组合这些条件比如取它们的OR关系。

就像这样:

Expression.Or(expr1, expr2)

或者像这样使用:

expr1 || expr2

但是我不能写成一个这样的表达式

Expression<Func<string, bool>> expr = s => s.Length == 5 || s == "someString"

那有什么解决方案呢?

请看如下回答的代码:

internal class ParameterReplacer : ExpressionVisitor {
    private readonly ParameterExpression _parameter;

    protected override Expression VisitParameter(ParameterExpression node) {
        return base.VisitParameter(_parameter);
    }

    internal ParameterReplacer(ParameterExpression parameter) {
        _parameter = parameter;
    }
}

class Program {

    static void Main(string[] args) {
        Expression<Func<string, bool>> expr1 = s => s.Length == 5;
        Expression<Func<string, bool>> expr2 = s => s == "someString";
        var paramExpr = Expression.Parameter(typeof(string));
        var exprBody = Expression.Or(expr1.Body, expr2.Body);
        exprBody = (BinaryExpression) new ParameterReplacer(paramExpr).Visit(exprBody);
        var finalExpr = Expression.Lambda<Func<string, bool>>(exprBody, paramExpr);
    }

}

ExpressionVisitor是在 .NET 4以后添加的新类。看到这里应该都懂了吧。