protected CompositeSpecification([NotNull] ISpecification<T> left, [NotNull] ISpecification<T> right,
            [NotNull] Func<Expression, Expression, Expression> mergeExpression)
        {
            left = left ?? throw new ArgumentNullException(nameof(left));
            right = right ?? throw new ArgumentNullException(nameof(right));
            mergeExpression = mergeExpression ?? throw new ArgumentNullException(nameof(mergeExpression));

            _left = left.AsComplexSpecification();
            _right = right.AsComplexSpecification();
            _expression = ExpressionComposer.Compose(_left.GetExpression(), _right.GetExpression(), mergeExpression);
            _grouping = right is CompositeSpecification<T>;
        }
        public NotSpecification(ISpecification <T> baseSpecification)
        {
            baseSpecification = baseSpecification ?? throw new ArgumentNullException(nameof(baseSpecification));

            _baseSpecification = baseSpecification.AsComplexSpecification();
            if (_baseSpecification is INegatableLinqSpecification <T> negatableSpecification)
            {
                _expression = negatableSpecification.GetNegationExpression();
            }
            else
            {
                _expression = ExpressionComposer.Compose(_baseSpecification.GetExpression(), Expression.Not);
            }
        }