private string CreateCityResourceUri(CityResourceParameters cityResourceParameters, ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link("GetCitiesWithPaging",
                                       new
                {
                    searchQuery = cityResourceParameters.SearchQuery,
                    genre = cityResourceParameters.Genre,
                    pageNumber = cityResourceParameters.PageNumber - 1,
                    pageSize = cityResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link("GetCitiesWithPaging",
                                       new
                {
                    searchQuery = cityResourceParameters.SearchQuery,
                    genre = cityResourceParameters.Genre,
                    pageNumber = cityResourceParameters.PageNumber + 1,
                    pageSize = cityResourceParameters.PageSize
                }));

            default:
                return(_urlHelper.Link("GetCitiesWithPaging",
                                       new
                {
                    searchQuery = cityResourceParameters.SearchQuery,
                    genre = cityResourceParameters.Genre,
                    pageNumber = cityResourceParameters.PageNumber,
                    pageSize = cityResourceParameters.PageSize
                }));
            }
        }
        public PagedList <City> GetCitiesWithPaging(CityResourceParameters cityResourceParameters)
        {
            var collectionBeforePaging = _context.Cities
                                         .OrderBy(c => c.Name)
                                         .ThenBy(c => c.Description).AsQueryable();

            if (!string.IsNullOrWhiteSpace(cityResourceParameters.Genre))
            {
                var genreForWhereClause = cityResourceParameters.Genre.Trim().ToLowerInvariant();
                collectionBeforePaging = collectionBeforePaging.Where(c => c.Name.ToLowerInvariant() == genreForWhereClause);
            }

            if (!string.IsNullOrWhiteSpace(cityResourceParameters.SearchQuery))
            {
                var searchQuery = cityResourceParameters.SearchQuery.Trim().ToLowerInvariant();
                collectionBeforePaging = collectionBeforePaging.Where(c => c.Name.ToLowerInvariant().Contains(searchQuery) ||
                                                                      c.Description.ToLowerInvariant().Contains(searchQuery));
            }

            return(PagedList <City> .Create(collectionBeforePaging, cityResourceParameters.PageNumber, cityResourceParameters.PageSize));
        }
        public IActionResult GetCitiesWithPaging(CityResourceParameters cityResourceParameters)
        {
            var cityEntitiesFromRepo = _cityInfoRepository.GetCitiesWithPaging(cityResourceParameters);

            var previousPageLink = cityEntitiesFromRepo.HasPrevious ? CreateCityResourceUri(cityResourceParameters, ResourceUriType.PreviousPage) : null;
            var nextPageLink     = cityEntitiesFromRepo.HasNext ? CreateCityResourceUri(cityResourceParameters, ResourceUriType.NextPage) : null;

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

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

            var results = AutoMapper.Mapper.Map <IEnumerable <CityWithoutPointsOfInterestDto> >(cityEntitiesFromRepo);

            return(Ok(results));
        }