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
                }));
            }
        }
Example #5
0
        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
             */
        }