//创建分页的url
        private string CreateArticleUrl(ArticlePrameters articlePrameters, PaginationUrlType paginationUrlType)
        {
            switch (paginationUrlType)
            {
            case PaginationUrlType.PreviousPage:
                var CurrentPrameter = new ArticlePrameters
                {
                    PageIndex = articlePrameters.PageIndex - 1,
                    PageSize  = articlePrameters.PageSize,
                    OrderBy   = articlePrameters.OrderBy,
                    Fields    = articlePrameters.Fields
                };
                return(Url.Link("GetArticles", CurrentPrameter));

            case PaginationUrlType.NextPage:
                var NextPrameter = new ArticlePrameters
                {
                    PageIndex = articlePrameters.PageIndex + 1,
                    PageSize  = articlePrameters.PageSize,
                    OrderBy   = articlePrameters.OrderBy,
                    Fields    = articlePrameters.Fields
                };
                return(Url.Link("GetArticles", NextPrameter));

            default:
                var PreviousPrameter = new ArticlePrameters
                {
                    PageIndex = articlePrameters.PageIndex,
                    PageSize  = articlePrameters.PageSize,
                    OrderBy   = articlePrameters.OrderBy,
                    Fields    = articlePrameters.Fields
                };
                return(Url.Link("GetArticles", PreviousPrameter));
            }
        }
        public async Task <IActionResult> Get(ArticlePrameters articlePrameters)
        {
            //验证排序字符串
            if (!PropertyMappingContainer.ValidateMappingExistsFor <ArticleViewModel, Article>(articlePrameters.OrderBy))
            {
                return(BadRequest("排序的属性不存在!"));
            }
            //验证资源塑形字符串
            if (!TypeHelper.TypeHasProperties <ArticleViewModel>(articlePrameters.Fields))
            {
                return(BadRequest("请求的属性不存在!"));
            }
            var ArticlesList = await Repository.GetAllArticleAsync(articlePrameters);

            //将Article映射到ArticleModel
            var ArticlesResource = Mapper.Map <IEnumerable <Article>, IEnumerable <ArticleViewModel> >(ArticlesList);
            //根据fields进行资源塑形
            var ArticlesAfterShaping = ArticlesResource.ToDynamicIEnumerable(articlePrameters.Fields);

            //为每一个资源添加links属性
            ArticlesAfterShaping = ArticlesAfterShaping.Select(x =>
            {
                x.TryAdd("links", CreateHateoasLinks((int)x.Where(y => y.Key == "Id").FirstOrDefault().Value, articlePrameters.Fields));
                return(x);
            });

            //新建匿名类存放翻页元数据
            var page = new
            {
                ArticlesList.PageSize,
                ArticlesList.PageIndex,
                ArticlesList.TotalItemsCount,
                ArticlesList.PageCount
            };
            //为资源创建前后页链接
            var links  = CreateHateoasLinksForPages(articlePrameters, ArticlesList.HasNext, ArticlesList.HasPrevious);
            var reslut = new
            {
                links,
                value = ArticlesAfterShaping
            };

            //将page类转化为Json,并写入HTTP请求头中
            Response.Headers.Add("Pagination", JsonConvert.SerializeObject(page, new JsonSerializerSettings {
                ContractResolver = new CamelCasePropertyNamesContractResolver() //将变量首字母改为小写
            }));

            return(Ok(reslut));
        }
        //创建页面的links
        public IEnumerable <LinkViewModel> CreateHateoasLinksForPages(ArticlePrameters articlePrameters, bool hasNextPage, bool hasLastPage)
        {
            var links = new List <LinkViewModel>();

            //添加selfLink
            links.Add(new LinkViewModel(CreateArticleUrl(articlePrameters, PaginationUrlType.CurrentPage), "self", "Get"));

            //判断是否有前一页/后一页 并加入links
            if (hasNextPage)
            {
                links.Add(new LinkViewModel(CreateArticleUrl(articlePrameters, PaginationUrlType.NextPage), "nextPage", "Get"));
            }
            if (hasLastPage)
            {
                links.Add(new LinkViewModel(CreateArticleUrl(articlePrameters, PaginationUrlType.PreviousPage), "lastPage", "Get"));
            }

            return(links);
        }
        //查找所有的博客

        public async Task <PaginatedList <Article> > GetAllArticleAsync(ArticlePrameters articlePrameters)
        {
            var result = MyDbContext.Articles.AsQueryable();

            //执行过滤操作

            if (!string.IsNullOrEmpty(articlePrameters.Title))//标题
            {
                result = result.Where(x => x.Title.ToLowerInvariant() == articlePrameters.Title.ToLowerInvariant());
            }
            if (!string.IsNullOrEmpty(articlePrameters.Auther))//作者
            {
                result = result.Where(x => x.Auther.ToLowerInvariant() == articlePrameters.Auther.ToLowerInvariant());
            }
            if (articlePrameters.AfterTime != null)//在某个时间之后
            {
                result = result.Where(x => x.Date.CompareTo(articlePrameters.AfterTime) >= 0);
            }
            if (articlePrameters.BeforeTime != null)//在某个时间之前
            {
                result = result.Where(x => x.Date.CompareTo(articlePrameters.BeforeTime) <= 0);
            }

            //执行模糊查询操作
            if (!string.IsNullOrEmpty(articlePrameters.Contain))//标题包含
            {
                result = result.Where(x => x.Title.ToLowerInvariant().Contains(articlePrameters.Contain.ToLowerInvariant()));
            }

            //根据排序选项排序
            result = result.ApplySort(articlePrameters.OrderBy, PropertyMappingContainer.Resolve <ArticleViewModel, Article>());

            //计算文章数量
            var count = await result.CountAsync();

            //执行分页操作
            var data = await result.Skip(articlePrameters.PageSize *articlePrameters.PageIndex).Take(articlePrameters.PageSize).ToListAsync();

            return(new PaginatedList <Article>(articlePrameters.PageSize, articlePrameters.PageIndex, count, data));
        }