public T Find(IDataQuerySpecification <T> spec)
        {
            var queryableResultWithIncludes = spec.Includes
                                              .Aggregate(ctx.Set <T>().AsQueryable(),
                                                         (current, include) => current.Include(include));

            var secondaryResult = spec.IncludeStrings
                                  .Aggregate(queryableResultWithIncludes,
                                             (current, include) => current.Include(include));

            return(secondaryResult
                   .FirstOrDefault(spec.Criteria));
        }
        public IEnumerable <T> Filter(IDataQuerySpecification <T> spec)
        {
            var queryableResultWithIncludes = spec.Includes
                                              .Aggregate(ctx.Set <T>().AsQueryable(),
                                                         (current, include) => current.Include(include));

            var secondaryResult = spec.IncludeStrings
                                  .Aggregate(queryableResultWithIncludes,
                                             (current, include) => current.Include(include));

            return(secondaryResult
                   .Where(spec.Criteria)
                   .AsEnumerable());
        }