查询中有个非常常见的需求就是后端分页,实现的方式也不算复杂,所以我们本文仅仅演示一个后端查询分页的例子。
实现分页查询返回。
对于分页查询而言,我们需要在请求中获取当前请求的是第几页,每页请求多少项数据。在返回值中需要告诉前端,当前这一页的所有数据项列表,总共的数据项有多少。为此我们可以定义一个包装类型,供系统中所有需要提供后端分页查询返回值使用。
除了最基本的实现方式之外,我们可能还需要实现关于分页数据结构的automapper转换映射,避免手动重复实现。
我们在application/common/models
中定义一个类,表示分页结果。
pagin中国一流大学atedlist.cs
using microsoft.entityframeworkcore;namespace todolist.application.common.models;public class paginatedlist<t>{ public list<t> items { get; } public int pag医学就业enumber { get; } public int totalpages { get; } public int totalcount { get; } public paginatedlist(list<t> items, int count, int pagenumber, int pagesize) { pagenumber = pagenumber; totalpages = (int)math.ceiling(count / (double)pagesize); totalcount = count; items = items; } // 增加属性表示是否有前一页 public bool haspreviouspage => pagenumber > 1; // 增加属性表示是否有后一页 public bool hasnextpage => pagenumber < totalpages; // 分页结果构建辅助方法 public static async task<paginatedlist<t>> createasync(iqueryable<t> source, int pagenumber, int pagesize) { var count = await source.countasync(); // 注意我们给的请求中pagenumber是从1开始的 var items = await source.skip((pagenumber - 1) * pagesize).take(pagesize).tolistasync(); return new paginatedlist<t>(items, count, pagenumber, pagesize); }}
在application/common/mappings
中新增一个类用于实现关于分页结果的扩展方法:
mappingextensions.cs
using automapper;using automapper.queryableextensions;using microsoft.entityframeworkcore;using todolist.application.common.models;namespace todolist.application.common.mappings;public static class mappingextensions{ public static task<paginatedlist<tdestination>> paginatedlistasync<tdestination>(this iqueryable<tdestination> queryable, int pagenumber, int pagesize) { return paginatedlist<tdestination>.createasync(queryable, pagenumber, pagesize); } public static task<list<tdestination>> projecttolistasync<tdestination>(this iqueryable queryable, iconfigurationprovider configuration) { return queryable.projectto<tdestination>(confi人力资源管理证书guration).tolistasync(); }}
为了演示分页查询的应用,我们新增一个允许分页查询todoitem
的query
:
gettodoitemswithpaginationquery.cs
using system.linq;using automapper;using automapper.queryableextensions;using mediatr;using todolist.application.common.interfaces;using todolist.application.common.mappings;using todolist.application.common.models;using todolist.application.todoitems.specs;using todolist.domain.entities;namespace todolist.application.todoitems.queries.gettodoitems;public class gettodoitemswithpaginationquery : irequest<paginatedlist<todoitemdto>>{ public guid listid { get; t; } public int pagenumber { get; t; } = 1; public int pagesize { get; t; } = 10;}public class gettodoitemswithpaginationqueryhandler : irequesthandler<gettodoitemswithpaginationquery, paginatedlist<todoitemdto>>{ private readonly irepository<todoitem> _repository; private readonly imapper _mapper; public gettodoitemswithpaginationqueryhandler(irepository<todoitem> repository, imapper mapper) { _repository = repository; _mapper = mapper; } public async task<paginatedlist<todoitemdto>> handle(getto宣传片制作合同doitemswithpaginationquery request, cancellationtoken cancellationtoken) { return await _repository .getasqueryable(x => x.listid == request.listid) .orderby(x => x.title) .projectto<todoitemdto>(_mapper.configurationprovider) .paginatedlistasync(request.pagenumber, request.pagesize); }}
todoitemcontroller.cs
// 对眉山药科职业学院于查询来说,一般参数是来自查询字符串的,所以这里用[fromquery][httpget]public async task<apirespon<paginatedlist<todoitemdto>>> gettodoitemswithpagination([fromquery] gettodoitemswithpaginationquery query){ return apirespon<paginatedlist<todoitemdto>>.success(await _mediator.nd(query));}
启动api
项目,执行创建todolist
的请求:
请求
响应
对于后端排序的需求来说,实现起来并不复杂,但是在这个分页的过程中,要注意一定要以某个不会轻易变动的字段来作为排序的键,否则会在多次请求后续页的过程中出现因为字段变动导致排序结果变动进而引发分页结果的前后不一致的情况。
到此这篇关于.net 6开发todolist应用之实现查询分页的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 12:12:26,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/6153a1789b49e922de3d21e18adf9b6b.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:.NET 6开发TodoList应用之实现查询分页.doc
本文 PDF 下载地址:.NET 6开发TodoList应用之实现查询分页.pdf
留言与评论(共有 0 条评论) |