public async Task <PagedList <Product> > GetPagedProductsWthCategoriesByFiltersAsync(PaginationQuery pagination, FilterParams filterParams) { IQueryable <Product> products = ApplicationDbContext.Products .Include(a => a.Category); FilterProductParams filterProductParams = filterParams as FilterProductParams; if (filterProductParams.MaxPrice == 0) { filterProductParams.MaxPrice = long.MaxValue; } if (FilterProductParams.HasSearchStringAndValidPriceRange(filterProductParams)) { products = products.Where(p => p.Name.Contains(filterProductParams.SearchString) && (p.Price >= filterProductParams.MinPrice && p.Price <= filterProductParams.MaxPrice)); } else if (FilterProductParams.HasSearchString(filterProductParams)) { products = products.Where(p => p.Name.Contains(filterProductParams.SearchString)); } else if (FilterProductParams.HasValidPriceRange(filterProductParams)) { products = products.Where(p => p.Price >= filterProductParams.MinPrice && p.Price <= filterProductParams.MaxPrice); } if (FilterParams.HasSort(filterProductParams)) { if (string.Equals(SortingTypes.ByName, filterProductParams.Sort, System.StringComparison.CurrentCultureIgnoreCase) && filterProductParams.SortDirection == true) { products = products.OrderBy(p => p.Name); } else if (string.Equals(SortingTypes.ByName, filterProductParams.Sort, System.StringComparison.CurrentCultureIgnoreCase) && filterProductParams.SortDirection == false) { products = products.OrderByDescending(p => p.Name); } else if (string.Equals(SortingTypes.ByPrice, filterProductParams.Sort, System.StringComparison.CurrentCultureIgnoreCase) && filterProductParams.SortDirection == true) { products = products.OrderBy(p => p.Price); } else if (string.Equals(SortingTypes.ByPrice, filterProductParams.Sort, System.StringComparison.CurrentCultureIgnoreCase) && filterProductParams.SortDirection == false) { products = products.OrderByDescending(p => p.Price); } } else { products = products.OrderBy(p => p.Name); } return(await PagedList <Product> .ToPagedList(products, pagination.PageNumber, pagination.PageSize)); }
public async Task <IActionResult> GetProductsByPageAsync([FromQuery] PaginationQuery paginationQuery, [FromQuery] FilterProductParams filterParams) { try { PagedList <Product> productsInDb = await _unitOfWork.Products.GetPagedProductsWthCategoriesByFiltersAsync(paginationQuery, filterParams); if (productsInDb == null) { return(NotFound()); } var productsDtoPage = PagedListMapper <Product, ProductDto> .Map(productsInDb, _mapper); var metadata = new { productsDtoPage.TotalCount, productsDtoPage.PageSize, productsDtoPage.CurrentPage, productsDtoPage.TotalPages, productsDtoPage.HasNext, productsDtoPage.HasPrevious }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata)); return(Ok(productsDtoPage)); } catch (Exception e) { return(BadRequest(e.Message)); } }