开发随笔记录——EF数据分页方法封装以及使用。

声明:本文章框架为ASP.NET Core 3.1 

首先构建一个用来获取前端信息的存储类(若要进行过滤、搜索、排序等功能,可在该储存类中添加相应属性),如下代码:

复制代码
  /// <summary>
    /// PageNumber默认为1,PageSize默认为10
    /// </summary>
    public class ResourceParmeters
    {
        public const int MaxPageSize = 50;

        private int _pageSize = 10;

        public int PageNumber { get; set; } = 1;

        public int PageSize {
            get { return _pageSize; }
            set { _pageSize = (value > MaxPageSize) ? MaxPageSize : value;  }
        }
    }
复制代码

其次在构建一个储存分页集合的方法并集成集合类(里面包含各个参数、构造函数、静态方法),如下代码:

复制代码
 /// <summary>
    /// 构建分页集合
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PagedList<T> : List<T>
    {
        /// <summary>
        /// 当前页
        /// </summary>
        public int CurrentPage { get; private set; }

        /// <summary>
        /// 总页数
        /// </summary>
        public int TotalPages { get; private set; }

        /// <summary>
        /// 每页数量
        /// </summary>
        public int PageSize { get; private set; }

        /// <summary>
        /// 总数量
        /// </summary>
        public int TotalCount { get; private set; }

        /// <summary>
        /// 是否有上一页
        /// </summary>
        public bool HasPrevious => CurrentPage > 1;

        /// <summary>
        /// 是否有下一页
        /// </summary>
        public bool HasNext => CurrentPage < TotalPages;

        public PagedList(List<T> items,int totalCount,int pageNumber,int pageSize)
        {
            TotalCount = totalCount;
            CurrentPage = pageNumber;
            PageSize = pageSize;
            TotalPages = (int)Math.Ceiling((double)totalCount / pageSize);
            AddRange(items);
        }

        public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source,int pageNumber,int pageSize)
        {
            var totalCount = source.Count();
            var items = source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
            var List = new PagedList<T>(items, totalCount, pageNumber, pageSize);
            return await Task.FromResult(List);
        }
    }
复制代码

以上两步完成后就可以进行使用阶段了,首先创建测试方法的接口,如下:

 Task<PagedList<TestModel>> GetAllAsync(ResourceParmeters parmeters);

接下来进行接口方法的实现,如下代码:

   public Task<PagedList<TestModel>> GetAllAsync(ResourceParmeters parmeters)
   {
       IQueryable<TestModel> queryableTestModel = DbContext.Set<TestModel>();
    //若过滤、搜索等字段不为空,再次可对相关属性进行检索,如queryTestModel.Where()
    //若要进行排序,且排序字段不为空时可对相关属性进行排序,如queryTestModel.OrderBy()
    //若要在一个OrderBy中完成对所有的排序条件进行排序,需要安装 Microsoft.EntityFrameworkCore.DynamicLinq
return PagedList<TestModel>.CreateAsync(queryableTestModel, parmeters.PageNumber, parmeters.PageSize); }

最后就可以在控制器中进行该方法的使用了,如下代码:

复制代码
      [HttpGet("testPageList",Name = nameof(GetTestModelsAsync))]
        public async Task<ActionResult<IEnumerable<TestModelDto>>> GetTestModelAsync([FromQuery] ResourceParmeters parmeters) {

            var pageList = await _repositoryWrapper.TestModel.GetAllAsync(parmeters);

            var paginationMetadata = new { 
            
                totalCount = pageList.TotalCount,
                pageSize = pageList.PageSize,
                currentPage  =pageList.CurrentPage,
                totalPages = pageList.TotalPages,
                previousePageLink = pageList.HasPrevious ? Url.Link(nameof(GetTestModels),new { pageNumber = pageList.CurrentPage -1 , pageSize = pageList.PageSize }) : null ,
                nextPageLink = pageList.HasNext ? Url.Link(nameof(GetTestModels),new { pageNumber = pageList.CurrentPage + 1, pageSize = pageList.PageSize }) : null 
            };

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata));
            var testModelDto = _mapper.Map<IEnumerable<TestModelDto>>(pageList);

            return testModelDto.ToList();
        }
复制代码

此上就是整个过程的代码实现,如有代码不对,还请大神指定一二,万分感谢。

 

posted @   苏瑾~  阅读(189)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示