protected static AbstractSpecification <TDomainModel> CombineSpecification(AbstractSpecification <TDomainModel> left, AbstractSpecification <TDomainModel> right, Func <Expression, Expression, BinaryExpression> combiner) { var lExpr = left.Predicate; var rExpr = right.Predicate; var param = Expression.Parameter(typeof(TDomainModel)); var combined = combiner.Invoke( new ReplaceParameterVisitor { { lExpr.Parameters.Single(), param } }.Visit(lExpr.Body), new ReplaceParameterVisitor { { rExpr.Parameters.Single(), param } }.Visit(rExpr.Body) ); return(new ConstructedSpecification <TDomainModel>(Expression.Lambda <Func <TDomainModel, Boolean> >(combined, param))); }
public static AbstractSpecification <T> Or <T>(this AbstractSpecification <T> left, AbstractSpecification <T> right) => left | right;
public static AbstractSpecification <T> And <T>(this AbstractSpecification <T> left, AbstractSpecification <T> right) => left & right;