namespace TrackCenter.Domain; public static class ExpressionExtensions { public static Expression> And(this Expression> expr1, Expression> expr2) { Expression right = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body); return Expression.Lambda>((Expression) Expression.AndAlso(expr1.Body, right), (IEnumerable) expr1.Parameters); } public static Expression> Or(this Expression> expr1, Expression> expr2) { var expr2Body = new RebindParameterVisitor(expr2.Parameters[0], expr1.Parameters[0]).Visit(expr2.Body); return Expression.Lambda>(Expression.OrElse(expr1.Body, expr2Body), expr1.Parameters); } private class RebindParameterVisitor : ExpressionVisitor { private readonly ParameterExpression _oldParameter; private readonly ParameterExpression _newParameter; public RebindParameterVisitor(ParameterExpression oldParameter, ParameterExpression newParameter) { _oldParameter = oldParameter; _newParameter = newParameter; } protected override Expression VisitParameter(ParameterExpression node) { return node == _oldParameter ? _newParameter : base.VisitParameter(node); } } }