private string CreateProductsResourceUri(ProductDtoParameter parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link(nameof(GetProducts), new { CategoryID = parameters.CategoryID, OrderBy = parameters.OrderBy, PageNumber = parameters.PageNumber - 1, PageSize = parameters.PageSize })); case ResourceUriType.NextPage: return(Url.Link(nameof(GetProducts), new { CategoryID = parameters.CategoryID, OrderBy = parameters.OrderBy, PageNumber = parameters.PageNumber + 1, PageSize = parameters.PageSize })); default: return(Url.Link(nameof(GetProducts), new { CategoryID = parameters.CategoryID, OrderBy = parameters.OrderBy, PageNumber = parameters.PageNumber, PageSize = parameters.PageSize })); } }
public async Task <ActionResult <IEnumerable <ProductDto> > > GetProducts([FromQuery] ProductDtoParameter parameter) { var queryProduct = productRepository.GetQueryableProducts().Where(p => p.OnSale && !p.IsDeleted); if (!string.IsNullOrWhiteSpace(parameter.CategoryID)) { queryProduct = queryProduct.Where(p => p.CategoryID.Equals(parameter.CategoryID)); } switch (parameter.OrderBy) { case OrderType.None: queryProduct = queryProduct.OrderBy(p => p.OrderbyId); break; case OrderType.Recommend: queryProduct = queryProduct.Where(p => p.Recommend > 0) .OrderBy(p => p.Recommend); break; case OrderType.TopSales: queryProduct = queryProduct.OrderByDescending(p => p.SoldCount); break; default: throw new IndexOutOfRangeException(); } var pagedProduct = await PagedList <Product> .Create(queryProduct, parameter.PageNumber, parameter.PageSize); var previousPageLink = pagedProduct.HasPrevious ? CreateProductsResourceUri(parameter, ResourceUriType.PreviousPage) : null; var nextPageLink = pagedProduct.HasNext ? CreateProductsResourceUri(parameter, ResourceUriType.NextPage) : null; var paginationMetadata = new { totalCount = pagedProduct.TotalCount, pageSize = pagedProduct.PageSize, currentPage = pagedProduct.CurrentPage, totalPages = pagedProduct.TotalPages, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var productDtos = mapper.Map <IEnumerable <ProductDto> >(pagedProduct); return(Ok(productDtos)); }