/// <summary>
        /// Applies the specification to the IQueryable type. This includes the Filtering and the Ordering.
        /// </summary>
        /// <param name="query"></param>
        /// <param name="specification"></param>
        /// <returns></returns>
        public static IQueryable <TType> ApplySpecification(IQueryable <TType> query, ISpecification <TType> specification)
        {
            var processor = new SpecificationProcessor <TType>();

            return(processor.BuildQuery(query, specification));
        }
 /// <summary>
 /// Applies the specification to the items collection and returns a IQueryable.
 /// </summary>
 /// <param name="items"></param>
 /// <param name="specification"></param>
 /// <typeparam name="TType"></typeparam>
 /// <returns></returns>
 public static IQueryable <TType> ApplySpecification <TType>(
     this IEnumerable <TType> items,
     ISpecification <TType> specification
     )
 => SpecificationProcessor <TType> .ApplySpecification(items.AsQueryable(), specification);