public async Task <PagedList <Product> > Query(ProductQryDto queryObject) { IQueryable <Product> products = null; if (queryObject != null) { products = _context.Products.Where(p => p.Name.Contains(queryObject.NameQry) && p.Price == (queryObject.PriceQry == 0 ? p.Price : queryObject.PriceQry)); } else { products = _context.Products; } var totalData = await products.CountAsync(); var mappingDictionary = this._propertyMappingService.GetPropertyMapping <ProductDto, Product>(); products = products.ApplySort(queryObject.OrderFields, mappingDictionary); var results = await products.Skip(queryObject.Skip).Take(queryObject.PageSize).ToListAsync(); PagedList <Product> queryList = new PagedList <Product>(results, totalData, queryObject.PageNumber, queryObject.PageSize); return(queryList); }
public async Task <IActionResult> GetProducts([FromQuery] ProductQryDto productQryDto) { this._logger.LogInformation("enter 'GetProducts' method."); if (!this._propertyMappingService.ValidMappingExistsFor <ProductDto, Product>(productQryDto.OrderFields)) //check if order field exist. { return(BadRequest()); } if (!this._propertyCheckerService.TypeHasProperties <ProductDto>(productQryDto.ShapeFields)) { return(BadRequest()); } PagedList <Product> products = await this._productDao.Query(productQryDto); var previousPageLink = products.HasPrevious ? CreateProductsResourceUri(productQryDto, ResourceUriType.PreviousPage) : null; var nextPageLink = products.HasNext ? CreateProductsResourceUri(productQryDto, ResourceUriType.NextPage) : null; var paginationMetadata = new { totalCount = products.TotalCount, pageSize = products.PageSize, currentPage = products.CurrentPage, totalPages = products.TotalPages, }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); var productDtos = this._mapper.Map <IEnumerable <ProductDto> >(products); //404 NotFound //数据塑形 var shapedData = productDtos.ShapData <ProductDto>(productQryDto.ShapeFields); //添加Hateoas支持 var links = CreateLinksForProduct(productQryDto, products.HasPrevious, products.HasNext); var shapedProductsWithLinks = shapedData.Select(c => { var productDict = c as IDictionary <string, object>; if (productDict.ContainsKey("Id")) { var productLinks = CreateLinksForProduct((int)productDict["Id"], null); productDict.Add("links", productLinks); } return(productDict); }); var linkedCollectionResource = new { value = shapedProductsWithLinks, links }; return(Ok(linkedCollectionResource)); }
private IEnumerable <LinkDto> CreateLinksForProduct(ProductQryDto parameters, bool hasPrevious, bool hasNext) { var links = new List <LinkDto>(); links.Add(new LinkDto(CreateProductsResourceUri(parameters, ResourceUriType.CurrentPage), "self", "GET")); if (hasPrevious) { links.Add(new LinkDto(CreateProductsResourceUri(parameters, ResourceUriType.PreviousPage), "get_previous_page", "GET")); } if (hasNext) { links.Add(new LinkDto(CreateProductsResourceUri(parameters, ResourceUriType.NextPage), "get_next_page", "GET")); } return(links); }
/// <summary> /// 创建翻页的url /// </summary> /// <param name="parameters"></param> /// <param name="type"></param> /// <returns></returns> private string CreateProductsResourceUri(ProductQryDto parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link(nameof(GetProducts), new { fields = parameters.ShapeFields, pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, nameQry = parameters.NameQry, priceQry = parameters.PriceQry, orderBy = parameters.OrderFields })); case ResourceUriType.NextPage: return(Url.Link(nameof(GetProducts), new { fields = parameters.ShapeFields, pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, nameQry = parameters.NameQry, priceQry = parameters.PriceQry, orderBy = parameters.OrderFields })); default: return(Url.Link(nameof(GetProducts), new { fields = parameters.ShapeFields, pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, nameQry = parameters.NameQry, priceQry = parameters.PriceQry, orderBy = parameters.OrderFields })); } }
public async void DoCurdOperation() { var productDao = Provider.GetService <IProductDao>(); var mapper = Provider.GetService <IMapper> (); #region test add var product1 = new Product { Name = "Pen", Price = 1 }; var product2 = new Product { Name = "Paper", Price = 1 }; var product3 = new Product { Name = "Box", Price = 5 }; bool result = await productDao.Add(product1); Assert.True(result); result = await productDao.Add(product2); Assert.True(result); result = await productDao.Add(product3); Assert.True(result); #endregion #region update product2.Name = "Calculater"; result = await productDao.Update(product2); Assert.True(result); #endregion #region query IEnumerable <Product> products = await productDao.QueryAll(); Assert.NotNull(products); Assert.Equal(3, products.Count()); var productFirst = products.First(); var productLast = products.Last(); Assert.IsType <Product>(productFirst); Assert.IsType <Product>(productLast); Assert.True(productFirst.Id < productLast.Id); var queryDto = new ProductQryDto { PriceQry = 1, OrderFields = "id desc", ShapeFields = "Id" }; PagedList <Product> queryResult = await productDao.Query(queryDto); Assert.NotNull(queryResult); Assert.Equal(2, queryResult.TotalCount); var productF = queryResult[0]; var productS = queryResult[1]; Assert.True(productS.Id < productF.Id); Assert.Equal("Calculater", productF.Name); Assert.Equal(1, productF.Price); queryDto.PageSize = 10; queryDto.PageNumber = 1; queryDto.OrderFields = "price,name desc"; Assert.Equal(0, queryDto.Skip); queryResult = await productDao.Query(queryDto); Assert.NotNull(queryResult); Assert.Equal(2, queryResult.TotalCount); Assert.Equal(2, queryResult.Count); var product = queryResult[0]; Assert.Equal("Pen", product.Name); Assert.Equal(1, product.Price); #endregion #region Shaped var productDtos = mapper.Map <IEnumerable <ProductDto> >(queryResult); var shapedData = productDtos.ShapData <ProductDto>(queryDto.ShapeFields); foreach (var obj in shapedData) { var productDict = obj as IDictionary <string, object>; Assert.NotNull(productDict); Assert.True(productDict.ContainsKey("Id")); Assert.False(productDict.ContainsKey("Name")); Assert.False(productDict.ContainsKey("Price")); } #endregion /* #region delete * result = await productDao.Delete(product1.Id); * Assert.True(result); * queryDto.NameQry = "Pen"; * queryResult = await productDao.Query(queryDto); * Assert.NotNull(queryResult); * Assert.Equal(0, queryResult.TotalCount); * result = await productDao.Delete(product2.Id); * Assert.True(result); * result = await productDao.Delete(product3.Id); * Assert.True(result); #endregion */ }