コード例 #1
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            var previousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null;

            var nextPageLink = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null;

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

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos.ShapeData(parameters.Fields)));
        }
コード例 #2
0
        /// <summary>
        /// 为 Companies 集合资源创建 HATEOAS 的 links(视频P42)
        /// </summary>
        /// <param name="parameters">CompanyDtoParameters</param>
        /// <param name="hasPrevious">是否有上一页</param>
        /// <param name="hasNext">是否有下一页</param>
        /// <returns>GetCompanies 集合资源的 links</returns>
        private IEnumerable <LinkDto> CreateLinksForCompany(CompanyDtoParameters parameters, bool hasPrevious, bool hasNext)
        {
            var links = new List <LinkDto>();

            //CurrentPage 当前页链接
            links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.CurrentPage),
                                  "self",
                                  "GET"));

            if (hasPrevious)
            {
                //PreviousPage 上一页链接
                links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage),
                                      "previous_page",
                                      "GET"));
            }

            if (hasNext)
            {
                //NextPage 下一页链接
                links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage),
                                      "next_page",
                                      "GET"));
            }

            return(links);
        }
コード例 #3
0
        public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters companyDtoParameters)
        {
            if (companyDtoParameters == null)
            {
                throw new ArgumentNullException(nameof(companyDtoParameters));
            }
            //if(string.IsNullOrWhiteSpace(companyDtoParameters.CompanyName)&&string.IsNullOrWhiteSpace(companyDtoParameters.SerchTerm))
            //{
            //    return await _context.Companies.ToListAsync();
            //}

            var queryExpress = _context.Companies as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(companyDtoParameters.CompanyName))
            {
                companyDtoParameters.CompanyName = companyDtoParameters.CompanyName.Trim();
                queryExpress = queryExpress.Where(x => x.Name == companyDtoParameters.CompanyName);
            }
            if (!string.IsNullOrWhiteSpace(companyDtoParameters.SerchTerm))
            {
                companyDtoParameters.SerchTerm = companyDtoParameters.SerchTerm.Trim();
                queryExpress = queryExpress.Where(x => x.Name.Contains(companyDtoParameters.SerchTerm) || x.Introduction.Contains(companyDtoParameters.SerchTerm));
            }
            //翻页逻辑在查询之后
            //   queryExpress = queryExpress.Skip(companyDtoParameters.PageSize * (companyDtoParameters.PageNumber - 1)).Take(companyDtoParameters.PageSize);
            //return await queryExpress.OrderBy(x => x.Name).ToListAsync();

            //排序
            var mappingDictionary = _propertyMappingService.GetPropertyMapping <CompanyDto, Company>();

            queryExpress = queryExpress.ApplySort(companyDtoParameters.OrderBy, mappingDictionary);

            //利用自定义PagedList创建分页
            return(await PagedList <Company> .Create(queryExpress, companyDtoParameters.PageNumber, companyDtoParameters.PageSize));
        }
コード例 #4
0
        //用查询参数来模糊查询有关的公司,这里只根据Name和Introduction来查询,如果这两个字段包含查询参数就返回相应的公司数据
        public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            //if (string.IsNullOrWhiteSpace(parameters.CompanyName) && string.IsNullOrWhiteSpace(parameters.SearchTerm))
            //{ return await _context.Companies.ToListAsync(); }

            var queryExpression = _context.Companies as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
            {
                parameters.CompanyName = parameters.CompanyName.Trim();
                queryExpression        = queryExpression.Where(x => x.Name == parameters.CompanyName);
            }

            if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                parameters.SearchTerm = parameters.SearchTerm.Trim();
                queryExpression       = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm));
            }
            //flip over, 翻页
            queryExpression = queryExpression.Skip(parameters.PageSize * (parameters.PageNumber - 1))
                              .Take(parameters.PageSize);
            //IQeryable延迟执行,到下面tolist才会执行查询语句到数据库
            return(await queryExpression.ToListAsync());
        }
コード例 #5
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields))
            {
                return(BadRequest());
            }

            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            //var previousPageLink = companies.HasPrevious
            //    ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage)
            //    : null;

            //var nextPageLink = companies.HasNext ?
            //    CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage)
            //    : null;

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

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata,
                                                                          new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));


            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);
            var shapedData  = companyDtos.ShapeData(parameters.Fields);

            var links = CreateLinksForCompany(parameters, companies.HasPrevious, companies.HasNext);

            var shapedCompaniesWithLinks = shapedData.Select(c =>
            {
                var companyDict  = c as IDictionary <string, object>;
                var companyLinks = CreateLinksForCompany((Guid)companyDict["Id"], null);
                companyDict.Add("links", companyLinks);
                return(companyDict);
            });

            var linkedCollectionResource = new
            {
                value = shapedCompaniesWithLinks,
                links
            };

            return(Ok(linkedCollectionResource));
        }
コード例 #6
0
        [HttpHead]                       //支持head
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters companyDtoParameters)
        {
            //验证http://localhost:5000/api/companies?orderBy=name参数  name是不符合的
            if (!_mappingService.ValidMappingExistsFor <CompanyDto, Company>(companyDtoParameters.OrderBy))
            {
                //http://localhost:5000/api/companies/5efc910b-2f45-43df-afae-620d40542822?fields=id,name  解决请求CompanyDto有无name属性
                return(BadRequest());
            }
            if (!_checkerService.TypeHasProperties <CompanyDto>(companyDtoParameters.Fields))
            {
                return(BadRequest());
            }

            //指定[FromQuery]可自动解析

            //对异常处理 不可这样做
            // throw new Exception("An Exception");

            //get 请求数据所以需要Dto

            //ActionResult<List<CompanyDto>> 在此可以替代IActionResult
            var companiess = await _companyRepository.GetCompaniesAsync(companyDtoParameters);

            // var previousPageLink = companiess.HasPrevious ? CreateCompaniesResourceUri(companyDtoParameters, ResourceUriType.PreviousPage) : null;
            //   var nextPageLink = companiess.HasNext ? CreateCompaniesResourceUri(companyDtoParameters, ResourceUriType.NextPage) : null;
            var paginationMetadata = new
            {
                totalCount  = companiess.TotalCount,
                pageSize    = companiess.PageSize,
                currentPage = companiess.CurrentPage,
                totalPages  = companiess.TotalPages,
                // previousPageLink,
                //  nextPageLink
            };

            Response.Headers.Add("X-Pagination", System.Text.Json.JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var links = CreateLinksForCiampany(companyDtoParameters, companiess.HasPrevious, companiess.HasNext);

            var companiessdto = _mapper.Map <IEnumerable <CompanyDto> >(companiess);
            var shapeddata    = companiessdto.ShapeData(companyDtoParameters.Fields);

            var shapedCompaniesWithLinks = shapeddata.Select(c =>
            {
                var comoanydict  = c as IDictionary <string, object>;
                var companylinks = CreateLinksForCiampany((Guid)comoanydict["Id"], null);
                comoanydict.Add("links", companylinks);
                return(comoanydict);
            });
            var linksCollectionResource = new
            {
                value = shapedCompaniesWithLinks,
                links
            };

            return(Ok(linksCollectionResource));
        }
コード例 #7
0
        public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            if (string.IsNullOrWhiteSpace(parameters.CompanyName) &&
                string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                return(await _context.Companies.ToListAsync());
            }

            var queryExpresion = _context.Companies as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
            {
                parameters.CompanyName = parameters.CompanyName.Trim();
                queryExpresion         = queryExpresion.Where(x => x.Name == parameters.CompanyName);
            }

            if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                parameters.SearchTerm = parameters.SearchTerm.Trim();
                queryExpresion        = queryExpresion.Where(x => x.Name.Contains(parameters.SearchTerm) ||
                                                             x.Introduction.Contains(parameters.SearchTerm));
            }

            return(await queryExpresion.ToListAsync());
        }
コード例 #8
0
ファイル: CompanyRepository.cs プロジェクト: MacroFei/Routine
        public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            //if (string.IsNullOrWhiteSpace(parameters.SearchTerm) &&
            //    string.IsNullOrWhiteSpace(parameters.CompanyName))
            //{
            //    return await _context.Companies.ToListAsync();
            //}
            var queryExpression = _context.Companies as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
            {
                parameters.CompanyName = parameters.CompanyName.Trim();
                queryExpression        = queryExpression.Where(x => x.Name == parameters.CompanyName);
            }
            if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                parameters.SearchTerm = parameters.SearchTerm.Trim();
                queryExpression       = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) ||
                                                              x.Introduction.Contains(parameters.SearchTerm));
            }
            //queryExpression = queryExpression.Skip(parameters.PageSize * (parameters.PageNumber - 1))
            //    .Take(parameters.PageSize);

            //return await queryExpression.ToListAsync();
            return(await PagedList <Company> .CreateAsync(queryExpression, parameters.PageNumber, parameters.PageSize));
        }
コード例 #9
0
        public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            // 如果参数类为空,则直接抛出空指针错误
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            // 如果没有传入参数,表示返回整个序列
            if (string.IsNullOrWhiteSpace(parameters.CompanyName) &&
                string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                return(await _context.Companies.ToListAsync());
            }

            // 有参数,表示需要筛选或查询结果
            var items = _context.Companies as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
            {
                // 筛选使用的是全相等
                parameters.CompanyName = parameters.CompanyName.Trim();
                items = items.Where(x => x.Name == parameters.CompanyName);
            }

            if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                // 查询使用的是包含关系
                parameters.SearchTerm = parameters.SearchTerm.Trim();
                items = items.Where(x => x.Name.Contains(parameters.SearchTerm) || x.Introduction.Contains(parameters.SearchTerm));
            }

            return(await items.OrderBy(x => x.Id).ToListAsync());
        }
コード例 #10
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields))
            {
                return(BadRequest());
            }

            var companies = await _companyRepository.GetCompaniesAsync(parameters);

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

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata,
                                                                          new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);
            var shapedData  = companyDtos.ShapeData(parameters.Fields);

            return(Ok(shapedData));
        }
コード例 #11
0
        private IEnumerable <LinkDto> CreateLinksForCompany(CompanyDtoParameters parameters,
                                                            bool hasPrevious,
                                                            bool hasNext)
        {
            List <LinkDto> links = new List <LinkDto>
            {
                new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.CurrentPage),
                            "self",
                            "Get")
            };

            if (hasPrevious)
            {
                links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage),
                                      "previous_page",
                                      "Get"));
            }
            if (hasNext)
            {
                links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage),
                                      "next_page",
                                      "Get"));
            }

            return(links);
        }
コード例 #12
0
        public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }


            var queryExpression = _context.Companies as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
            {
                parameters.CompanyName = parameters.CompanyName.Trim();
                queryExpression        = queryExpression.Where(x => x.Name == parameters.CompanyName);
            }

            if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                parameters.CompanyName = parameters.SearchTerm.Trim();
                queryExpression        = queryExpression.Where(x => x.Name.Contains(parameters.SearchTerm) ||
                                                               x.Introduction.Contains(parameters.SearchTerm));
            }

            //queryExpression = queryExpression.Skip(parameters.PageSize * (parameters.PageNumber - 1))
            //    .Take(parameters.PageSize);

            var mappingDictionary = _propertyMappingService.GetPropertyMapping <CompanyDto, Company>();

            queryExpression = queryExpression.ApplySort(parameters.OrderBy, mappingDictionary);

            return(await PagedList <Company> .CreateAsync(queryExpression, parameters.PageNumber, parameters.PageSize));
        }
コード例 #13
0
        [HttpHead]                                       //让该方法支持 Head 请求,可能用于查看Api的此功能是否可以正常使用,执行后不返回具体数据,只返回状态码,但里面的代码是跟get一样执行的,注意这个 Head 请求的写法只能写在Get操作的方法上
        public async Task <IActionResult> GetCompanies(  //使用 ActionResult<T>注明返回类型,有利于自动文档的建立;  但是加了塑形后返回的是可选字段的<T> ,不能指定是什么类型,所以用回IActionResult
            [FromQuery] CompanyDtoParameters parameters) //现在的parameters参数属于复杂参数,netcore默认这个是[FromBody]的,但如果现在用http://localhost:5000/api/companies/?CompanyName=Microsoft&SearchTerm=i这样的Uril去访问这个资源的话,将会出现415的错误码,因为这个Uril用的是[FromQuery]方式接收参数,与请求中的参数来源不一致导致的,所以这里的参数前要加上[FromQuery]就说明参数的来源.
        {
            if (!_propertyMappingService.VaildMappingExistsFor <CompanyDto, Company>(parameters.OrderBy))
            {
                return(BadRequest());
            }
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            var previousPageLink   = companies.HasPrevious ? CreateCompanyesResourceUri(parameters, ResourceUriType.PreviousPage) : null;
            var nextPageLink       = companies.HasNext ? CreateCompanyesResourceUri(parameters, ResourceUriType.NextPage) : null;
            var paginationMatadata = new
            {
                totalCount  = companies.TotalCount,
                pageSize    = companies.PageSize,
                currentPage = companies.CurrentPage,
                totalPages  = companies.TotalPages,
                previousPageLink,
                nextPageLink
            };

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMatadata,
                                                                          //加入这个参数,把生成的Link中把不安全的字符比如“\”自动转化安全的功能去掉,也就是生成象"http://abc.com/abc"这种
                                                                          new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos.ShapeData(parameters.Fields)));
        }
コード例 #14
0
        private string CreateCompaniesResourceUri(CompanyDtoParameters parameters, ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link(nameof(GetCompanies), new
                {
                    pageNumber = parameters.PageIndex - 1,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));

            case ResourceUriType.NextPage:
                return(Url.Link(nameof(GetCompanies), new
                {
                    pageNumber = parameters.PageIndex + 1,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));

            default:
                return(Url.Link(nameof(GetCompanies), new
                {
                    pageNumber = parameters.PageIndex,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));
            }
        }
コード例 #15
0
        private IEnumerable <LinkDto> createLinksForCompany(CompanyDtoParameters parameters)
        {
            var links = new List <LinkDto>();

            links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.Currentpage), "self", "GET"));

            return(links);
        }
コード例 #16
0
        // 1、默认情况会生成Task<IActionResult>的返回类型,这是一个泛型,最好将返回类型确定,这样可以帮助更好的阅读代码
        // 2、默认使用HttpGet方法,并且直接使用class的Route,.net core会对参数进行自动推断,以确定使用什么样的方式获取参数([FromBody] / [FromQuery] / ...)
        //    这里使用一个参数q,通常是一个查询参数,将参数传入,根据是否为空,进行不同数据结果的返回。
        // 3、使用mapper(AutoMapper)类,可以映射数据库模型和用户使用模型之间的关系,具体实现在Profiles中,同时注册了服务,即可使用。
        //public async Task<ActionResult<IEnumerable<CompanyDto>>> GetCompanies(string q)
        //{
        //    var companies = await companyRepository.GetCompaniesAsync(q);

        //    var companyDtos = mapper.Map<IEnumerable<CompanyDto>>(companies);

        //    return Ok(companyDtos);
        //}


        // 更新参数的使用,使用一个参数类来传参。同时,因为这里传入的是一个复杂的类,和上面的单独传入的q有区别,系统会默认认为这应该是从[FromBody]传入的,
        // 会导致查询条件出错并且body中找不到相应参数。这时,需要显式的给出[FromQuery]告诉系统这时一个查询参数即可。
        public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies([FromQuery] CompanyDtoParameters companyDtoParameters)
        {
            var companies = await companyRepository.GetCompaniesAsync(companyDtoParameters);

            var companyDtos = mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos));
        }
コード例 #17
0
        [HttpHead] //添加对 Http Head 的支持,Head 请求只会返回 Header 信息,没有 Body(视频P16)
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            //判断Uri query 字符串中的 orderby 是否合法(视频P38)
            if (!_propertyMappingService.ValidMappingExistsFor <CompanyDto, Company>(parameters.OrderBy))
            {
                return(BadRequest());  //返回状态码400
            }

            //判断Uri query 字符串中的 fields 是否合法(视频P39)
            if (!_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields))
            {
                return(BadRequest());  //返回状态码400
            }

            //GetCompaniesAsync(parameters) 返回的是经过翻页处理的 PagedList<T>(视频P35)
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            //向 Header 中添加翻页信息(视频P35)
            //上一页的 URI
            var previousPageLink = companies.HasPrevious
                                ? CreateCompaniesResourceUri(parameters, ResourceUnType.PreviousPage)
                                : null;
            //下一页的 URI
            var nextPageLink = companies.HasNext
                                ? CreateCompaniesResourceUri(parameters, ResourceUnType.NextPage)
                                : null;
            var paginationMetdata = new
            {
                totalCount  = companies.TotalCount,
                pageSize    = companies.PageSize,
                currentPage = companies.CurrentPage,
                totalPages  = companies.TotalPages,
                previousPageLink,
                nextPageLink
            };

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetdata,
                                                                          new JsonSerializerOptions //URI 中的‘&’、‘?’符号不应该被转义,因此改用不安全的 Encoder
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));
            //不使用 AutoMapper
            //var companyDtos = new List<CompanyDto>();
            //foreach(var company in companies)
            //{
            //    companyDtos.Add(new CompanyDto
            //    {
            //        Id = company.Id,
            //        Name = company.Name
            //    });
            //}
            //
            //使用 AutoMapper(视频P12)
            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos.ShapeData(parameters.Fields)));  //OK() 返回状态码200
        }
コード例 #18
0
        private string CreateCompaniesResourceUri(CompanyDtoParameters parameters, ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link(
                           nameof(GetCompanies),
                           new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageNumber = parameters.PageNumber - 1,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));

            case ResourceUriType.NextPage:
                return(Url.Link(
                           nameof(GetCompanies),
                           new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageNumber = parameters.PageNumber + 1,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));

            case ResourceUriType.CurrentPage:
                return(Url.Link(
                           nameof(GetCompanies),
                           new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageNumber = parameters.PageNumber,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));

            default:
                return(Url.Link(
                           nameof(GetCompanies),
                           new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageNumber = parameters.PageNumber,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm
                }));
            }
        }
コード例 #19
0
        //public async Task<IActionResult> GetCompanies() 與下方相同但下方更明確
        public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            //                       目標:IEnumerable<CompanyDto>來源companies
            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos));  //OK() 返回200
        }
コード例 #20
0
        public async void OnLoaded()
        {
            enterpriseApi = Container.Resolve <IEnterpriseApi>();

            CompanyCards      = new ObservableCollection <Card>();
            companyParameters = new CompanyDtoParameters();

            await Task.Run(() => GetCompanies());
        }
コード例 #21
0
        //FromQuery是重点,正常如果不指定fromquery就会报错
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            if (!_propertyMappingService.ValidMappingExistFor <CompanyDto, Company>(parameters.OrderBy) ||
                !_propertyCheckerService.TypeHasProperties <CompanyDto>(parameters.Fields))
            {
                return(BadRequest());
            }

            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            //var previousPageLink = companies.HasPrevious ?
            //    CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage)
            //    : null;
            //var nextPageLink = companies.HasNext ?
            //    CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage)
            //    : null;

            var oaginationMetadata = new
            {
                totalCount  = companies.TotalCount,
                totalPages  = companies.TotalPages,
                pageSize    = companies.PageSize,
                currentPage = companies.CurrentPage,
                //previousPageLink,
                //nextPageLink
            };

            //自定义header 返回分页数据, 因为如果在OK体内返回其他信息不符合Restful api的设计原则.
            //方法是GetCompanies,应该只返回companies的数据,而不应该包含其他额外数据,额外数据应该通过自定义header返回.
            Response.Headers.Add("X-Pagination", System.Text.Json.JsonSerializer.Serialize(oaginationMetadata, new System.Text.Json.JsonSerializerOptions
            {
                //http web 默认会将一些字符转义,保护url,添加此属性不会将&符号转义.
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);
            var shapedData  = companyDtos.ShapeData(parameters.Fields);

            var links = CreateLinksForCompany(parameters, companies.HasPrevious, companies.HasNext);

            var shapedCompaniesWithLinks = shapedData.Select(a =>
            {
                var companyDic   = a as IDictionary <string, object>;
                var companyLinks = CreateLinksForCompany((Guid)companyDic["Id"], null);
                companyDic.Add("links", companyLinks);
                return(companyDic);
            });

            var linkedCollectionResource = new
            {
                value = shapedCompaniesWithLinks,
                links
            };

            return(Ok(linkedCollectionResource));
        }
コード例 #22
0
        [HttpHead]                                      //一个方法可以同时支持Get与Head,相同的是,方法都会正常执行;不同的是,HttpHead不用传输body内容。
        public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies(
            [FromQuery] CompanyDtoParameters parameters //复杂类型,默认从body绑定,因此需要手动指定从query绑定,否则415错误
            )
        {
            var companies = await _repository.GetCompaniesAsync(parameters);

            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos));
        }
コード例 #23
0
        /// <summary>
        /// Gets the companies asynchronous.
        /// </summary>
        /// <param name="parameters">The parameters.</param>
        /// <returns></returns>
        public async Task <PagedList <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            Guards.ThrowIfNull(parameters);

            var pagedCompanies = await PagedList <Company> .CreateAsync(
                companyRepository.Select,
                parameters.PageNumber,
                parameters.PageSize);

            return(pagedCompanies);
        }
コード例 #24
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            //var companyDtos = new List<CompanyDto>();
            //foreach (var company in companies)
            //{
            //    companyDtos.Add(new CompanyDto { Id = company.Id, Name = company.Name });
            //}
            return(Ok(companyDtos));
        }
コード例 #25
0
        /// <summary>
        /// 生成上一页或下一页的 URI(P35)
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        private string CreateCompaniesResourceUri(CompanyDtoParameters parameters,
                                                  ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:     //上一页
                return(Url.Link(
                           //API 名
                           nameof(GetCompanies),
                           //Uri Query 字符串参数 匿名类
                           new
                {
                    pageNumber = parameters.PageNumber - 1,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm,
                    orderBy = parameters.OrderBy,      //排序(P38)
                    fields = parameters.Fields         //数据塑形(P39)
                }));

                ;

            case ResourceUriType.NextPage:     //下一页
                return(Url.Link(
                           nameof(GetCompanies),
                           new
                {
                    pageNumber = parameters.PageNumber + 1,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm,
                    orderBy = parameters.OrderBy,
                    fields = parameters.Fields
                }));

            default:     //当前页
                return(Url.Link(
                           nameof(GetCompanies),
                           new
                {
                    pageNumber = parameters.PageNumber,
                    pageSize = parameters.PageSize,
                    companyName = parameters.CompanyName,
                    searchTerm = parameters.SearchTerm,
                    orderBy = parameters.OrderBy,
                    fields = parameters.Fields
                }));
            }
        }
コード例 #26
0
        //public async Task<IActionResult> GetCompanies()
        //既可以使用上面的这个方式,也可以使用下面的这个——下面的是使用ActionResult<T>、其中T是IEnumerable<CompanyDto>类型
        public async Task <ActionResult <IEnumerable <CompanyDto> > > GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            //生成前一页标签
            var previousPageLike = companies.HasPrevious
                ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage)
                : null;

            //生成后一页标签
            var nextPageLinke = companies.HasNext
                ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage)
                : null;

            var pagenationMetadata = new
            {
                totalCount  = companies.TotalCount,
                pageSize    = companies.PageSize,
                currentPage = companies.CurrentPage,
                totalPages  = companies.TotalPages,
                previousPageLike,
                nextPageLinke
            };

            Response.Headers.Add("X-Pagenation", JsonSerializer.Serialize(pagenationMetadata, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));
            if (companies == null)
            {
                return(NotFound());
            }

            //进行映射
            var companyDto = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            //var companyDto = new List<CompanyDto>();

            //foreach (var company in companies)
            //{
            //    companyDto.Add(new CompanyDto
            //    {
            //        Id = company.Id,
            //        Name = company.Name
            //    });
            //}
            //return new JsonResult(companies);
            return(Ok(companyDto));
        }
コード例 #27
0
        public async Task <IEnumerable <Company> > GetCompaniesAsync(CompanyDtoParameters parameters)
        {
            var item = _routineDBContext.Company as IQueryable <Company>;

            if (!string.IsNullOrWhiteSpace(parameters.CompanyName))
            {
                item = item.Where(x => x.Name.Contains(parameters.CompanyName));
            }
            if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
            {
                item = item.Where(x => x.Introduction.Contains(parameters.SearchTerm) || x.Name.Contains(parameters.SearchTerm));
            }
            item = item.Skip(parameters.PageSize * (parameters.PageNumber - 1)).Take(parameters.PageSize);
            return(await item.ToListAsync());
        }
コード例 #28
0
        private IEnumerable <LinkDto> CreateLinksForCiampany(CompanyDtoParameters parameters, bool haspre = false, bool hasnext = false)
        {
            var links = new List <LinkDto>();

            links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.CurrentPage), "self", "GET"));
            if (haspre)
            {
                links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage), "Previous_page", "GET"));
            }
            if (hasnext)
            {
                links.Add(new LinkDto(CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage), "Next_page", "GET"));
            }

            return(links);
        }
コード例 #29
0
        [HttpHead]                                                                                  //添加对 Http Head 的支持,使用 Head 请求时不会返回 Body
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters) //Task<IActionResult> = Task<ActionResult<List<CompanyDto>>>
        {
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            //向 Header 中添加翻页信息(视频P35)
            //上一页的 URI
            var previousPageLink = companies.HasPrevious
                                ? CreateCompaniesResourceUri(parameters, ResourceUnType.PreviousPage)
                                : null;
            //下一页的 URI
            var nextPageLink = companies.HasNext
                                ? CreateCompaniesResourceUri(parameters, ResourceUnType.NextPage)
                                : null;
            var paginationMetdata = new
            {
                totalCount  = companies.TotalCount,
                pageSize    = companies.PageSize,
                currentPage = companies.CurrentPage,
                totalPages  = companies.TotalPages,
                previousPageLink,
                nextPageLink
            };

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetdata,
                                                                          new JsonSerializerOptions //URI 中的‘&’、‘?’符号不应该被转义,因此改用不安全的 Encoder
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));
            //不使用 AutoMapper
            //var companyDtos = new List<CompanyDto>();
            //foreach(var company in companies)
            //{
            //    companyDtos.Add(new CompanyDto
            //    {
            //        Id = company.Id,
            //        Name = company.Name
            //    });
            //}

            //使用 AutoMapper(视频P12)
            var companyDtos = _mapper.Map <IEnumerable <CompanyDto> >(companies);

            return(Ok(companyDtos));  //OK() 返回状态码200
        }
コード例 #30
0
        public async Task <IActionResult> GetCompanies([FromQuery] CompanyDtoParameters parameters)
        {
            var companies = await _companyRepository.GetCompaniesAsync(parameters);

            var previousPageLink = companies.HasPrevious ? CreateCompaniesResourceUri(parameters, ResourceUriType.PreviousPage) : null;
            var nextPageLink     = companies.HasNext ? CreateCompaniesResourceUri(parameters, ResourceUriType.NextPage) : null;

            var paginationMetadate = new
            {
                totalCount  = companies.ToTalCount,
                pageSize    = companies.PageSize,
                currentPage = companies.CurrentPage,
                totalPages  = companies.ToTalPages,
                previousPageLink,
                nextPageLink
            };

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadate, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var companyDto = _mapper.Map <IEnumerable <CompanyDto> >(companies);
            var shape      = companyDto.ShapeData(parameters.Fields);

            var links = createLinksForCompany(parameters);

            var shapedCompaniesWithLinks = shape.Select(c => {
                var companyDict  = c as IDictionary <string, Object>;
                var companyLinks = CreatLinkForCompany((Guid)companyDict["Id"], null);
                companyDict.Add("links", companyLinks);
                return(companyDict);
            });

            var linkedCollectionResource = new
            {
                value = shapedCompaniesWithLinks,
                links
            };

            return(Ok(linkedCollectionResource));
        }