/// <inheritdoc />
        public override Expression <Func <Event, bool> > GetFilterExpression()
        {
            if (_specifications.Length == 0)
            {
                return(e => true);
            }

            Expression <Func <Event, bool> > result = _specifications[0].GetFilterExpression();

            var parameterReplacer = new ParameterReplacer();

            foreach (var specification in _specifications.Skip(1))
            {
                var filterExpression = specification.GetFilterExpression();

                var parameter = Expression.Parameter(typeof(Event));

                result = Expression.Lambda <Func <Event, bool> >(
                    Expression.OrElse(
                        parameterReplacer.ReplaceParameterWith(parameter, result.Body),
                        parameterReplacer.ReplaceParameterWith(parameter, filterExpression.Body)
                        ),
                    parameter);
            }

            return(result);
        }
        /// <inheritdoc />
        public override Expression <Func <Event, bool> > GetFilterExpression()
        {
            var parameterReplacer = new ParameterReplacer();

            var filterExpression = _specification.GetFilterExpression();

            var parameter = Expression.Parameter(typeof(Event));

            var result = Expression.Lambda <Func <Event, bool> >(
                Expression.Not(
                    parameterReplacer.ReplaceParameterWith(parameter, filterExpression.Body)
                    ),
                parameter);

            return(result);
        }