コード例 #1
0
        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);
        }
コード例 #2
0
        // 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);
        }