Вы можете использовать Expression.AndAlso / OrElse для объединения логических выражений, но вы должны убедиться, что значения параметра одинаковы.
У меня были проблемы с EF и PredicateBuilder , поэтому я сделал свой собственный, не прибегая к Invoke, чтобы я мог использовать вот так:
var filterC = filterA.And(filterb);
Исходный код для моего PredicateBuilder:
public static class PredicateBuilder {
public static Expression> And(this Expression> a, Expression> b) {
ParameterExpression p = a.Parameters[0];
SubstExpressionVisitor visitor = new SubstExpressionVisitor();
visitor.subst[b.Parameters[0]] = p;
Expression body = Expression.AndAlso(a.Body, visitor.Visit(b.Body));
return Expression.Lambda>(body, p);
}
public static Expression> Or(this Expression> a, Expression> b) {
ParameterExpression p = a.Parameters[0];
SubstExpressionVisitor visitor = new SubstExpressionVisitor();
visitor.subst[b.Parameters[0]] = p;
Expression body = Expression.OrElse(a.Body, visitor.Visit(b.Body));
return Expression.Lambda>(body, p);
}
}
И класс утилиты для замены параметры в лямбда:
internal class SubstExpressionVisitor : System.Linq.Expressions.ExpressionVisitor {
public Dictionary subst = new Dictionary();
protected override Expression VisitParameter(ParameterExpression node) {
Expression newValue;
if (subst.TryGetValue(node, out newValue)) {
return newValue;
}
return node;
}
}
Регулярное выражение заменяет все совпадения на обратную косую черту и соответствующую подстроку. Он соответствует любым отдельным символам из набора между [
и ]
. То есть:
-
simple dash \\
одиночная обратная косая черта (с предшествующей другой обратной косой чертой, потому что это сервер как escape-символ) /
косая черта \\
снова одиночная обратная косая черта (здесь она устарела) ^
, $
, *
, +
, ?
, .
, [ 1112], )
, |
, [
одиночные символы \]
закрывающей скобке предшествует escape-символ, в противном случае будет закрыт набор символов для соответствия }
одиночные символы Строка замены \\[1119]amp;
просто говорит:
\\
add одиночная обратная косая черта [1121]amp;
add вся подстрока соответствует выражению