public IExpressionSpecification <TModel> Apply <TModel>(IExpressionSpecification <TModel> specification) { var candidateExpr = specification.Expression.Parameters[0]; var body = Expression.Not(specification.Expression.Body); var resultExpression = Expression.Lambda <Func <TModel, bool> >(body, candidateExpr); var combinedSpecification = new DynamicExpressionSpecification <TModel>(resultExpression); return(combinedSpecification); }
// https://stackoverflow.com/questions/457316/combining-two-expressions-expressionfunct-bool public IExpressionSpecification <TModel> Combine <TModel>(IExpressionSpecification <TModel> left, IExpressionSpecification <TModel> right) { Expression <Func <TModel, bool> > resultExpression; var param = left.Expression.Parameters.First(); if (ReferenceEquals(param, right.Expression.Parameters.First())) { resultExpression = Expression.Lambda <Func <TModel, bool> >( Expression.AndAlso(left.Expression.Body, right.Expression.Body), param); } else { resultExpression = Expression.Lambda <Func <TModel, bool> >( Expression.AndAlso( left.Expression.Body, Expression.Invoke(right.Expression, param)), param); } var combinedSpecification = new DynamicExpressionSpecification <TModel>(resultExpression); return(combinedSpecification); }