public PagedList <Course> GetCourses(
            CoursesResourceParameters coursesResourceParameters)
        {
            //var collectionBeforePaging = _context.Courses
            //    .OrderBy(a => a.FirstName)
            //    .ThenBy(a => a.LastName).AsQueryable();

            var collectionBeforePaging =
                _context.Courses
                .ApplySort(coursesResourceParameters.OrderBy,
                           _propertyMappingService.GetPropertyMapping <CourseDto, Course>());



            if (!string.IsNullOrEmpty(coursesResourceParameters.SearchQuery))
            {
                // trim & ignore casing
                var searchQueryForWhereClause = coursesResourceParameters.SearchQuery
                                                .Trim().ToLowerInvariant();

                collectionBeforePaging = collectionBeforePaging
                                         .Where(a => a.Description.ToLowerInvariant().Contains(searchQueryForWhereClause) ||
                                                a.Name.ToLowerInvariant().Contains(searchQueryForWhereClause));
            }

            return(PagedList <Course> .Create(collectionBeforePaging,
                                              coursesResourceParameters.PageNumber,
                                              coursesResourceParameters.PageSize));
        }
        public IActionResult GetCourses(CoursesResourceParameters coursesResourceParameters)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <CourseDto, Course>
                    (coursesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            //if (!_typeHelperService.TypeHasProperties<CourseDto>
            //    (coursesResourceParameters.Fields))
            //{
            //    return BadRequest();
            //}

            var coursesFromRepo = _hotMealRepository.GetCourses(coursesResourceParameters);

            var previousPageLink = coursesFromRepo.HasPrevious ?
                                   CreateCoursesResourceUri(coursesResourceParameters,
                                                            ResourceUriType.PreviousPage) : null;

            var nextPageLink = coursesFromRepo.HasNext ?
                               CreateCoursesResourceUri(coursesResourceParameters,
                                                        ResourceUriType.NextPage) : null;

            var paginationMetadata = new
            {
                totalCount       = coursesFromRepo.TotalCount,
                pageSize         = coursesFromRepo.PageSize,
                currentPage      = coursesFromRepo.CurrentPage,
                totalPages       = coursesFromRepo.TotalPages,
                previousPageLink = previousPageLink,
                nextPageLink     = nextPageLink
            };

            Response.Headers.Add("X-Pagination",
                                 Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata));

            var courses = Mapper.Map <IEnumerable <CourseDto> >(coursesFromRepo);

            return(Ok(courses));
        }
        private string CreateCoursesResourceUri(
            CoursesResourceParameters coursesResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link("GetCourses",
                                       new
                {
                    //fields = coursesResourceParameters.Fields,
                    orderBy = coursesResourceParameters.OrderBy,
                    searchQuery = coursesResourceParameters.SearchQuery,
                    pageNumber = coursesResourceParameters.PageNumber - 1,
                    pageSize = coursesResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link("GetCourses",
                                       new
                {
                    //fields = coursesResourceParameters.Fields,
                    orderBy = coursesResourceParameters.OrderBy,
                    searchQuery = coursesResourceParameters.SearchQuery,
                    pageNumber = coursesResourceParameters.PageNumber + 1,
                    pageSize = coursesResourceParameters.PageSize
                }));

            default:
                return(_urlHelper.Link("GetCourses",
                                       new
                {
                    //fields = coursesResourceParameters.Fields,
                    orderBy = coursesResourceParameters.OrderBy,
                    searchQuery = coursesResourceParameters.SearchQuery,
                    pageNumber = coursesResourceParameters.PageNumber,
                    pageSize = coursesResourceParameters.PageSize
                }));
            }
        }