开发随笔记录——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(); }
此上就是整个过程的代码实现,如有代码不对,还请大神指定一二,万分感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术