使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能
2022-02-09 22:41
986 查看
系列导航
使用Hot Chocolate和.NET 6构建GraphQL应用文章索引
需求
GraphQL中的查询分页相对来说是查询中比较难理解的,接口的Schema也和其他不一样。在这篇文章中,我们来实现简单的查询分页。
思路
Hot Chocolate提供了两种排序方式:基于Cursor的分页和基于Offset的分页。这两种方式的区别在于:基于Cursor的分页是随结果返回每条数据的一个游标字符串,下次分页查询是通过
Where子句来比较游标的大小来决定去获取哪一部分的数据;而基于Offset的方式,是类似于传统的后端分页方式,即使用
OFFSET(
SKIP+
TAKE)方式去获取数据,后者在面对数据库会发生频繁变动(插入或删除数据)或者面对大量数据集的时候性能不如前者。但是对于基于Cursor的分页方式而言,如果对一个没有建立索引的数据列使用
Where和
Order By,速度是不如
Order By和
OFFSET的。
在这篇文章中,我们会实现这两种不同方式的分页效果。Hot Chocolate分别提供了
UsePaging和
UseOffsetPaging属性来完成分页需求。
实现
要使用分页属性,需要在接口上方添加
UsePaging或
UseOffsetPaging即可,注意属性添加的顺序。
Query.cs
[UsePaging] [UseProjection] [UseFiltering] [UseSorting] public IQueryable<Post> GetPosts([Service] IRepository<Post> repository) => repository.GetAsQueryable();
或者
[UseOffsetPaging] [UseProjection] [UseFiltering] [UseSorting] public IQueryable<Post> GetPosts([Service] IRepository<Post> repository) => repository.GetAsQueryable();
这样就实现了查询结果的分页,同时我们可以在注入Hot Chocolate的地方进行全局配置:
builder.Services .AddGraphQLServer() .SetPagingOptions(new PagingOptions { MaxPageSize = 50, IncludeTotalCount = true }) .AddFiltering() .AddProjections() .AddSorting() .AddQueryType<Query>() .AddType<PostType>();
下面我们来验证一下。
验证
启动
Api项目,调用接口:
可以看到在返回体中数据已经按照我们指定的排序和分页结果返回了,注意在返回中包含了
totalCount(这是我们在全局配置中指定一起返回的),在
pageInfo中指出了是否有下一页或上一页,使用Cursor进行分页的关键之处在于返回体中还包含了每条记录的
cursor值。接下来我们指定下次获取数据的起始游标值:
这样就获取了后一页的数据。
接下来我们看一下使用Offset方式分页的结果:
在这种方式下,我们看到了熟悉的
skip和
take参数,如果需要获取下一页数据,只需要修改
skip参数即可:
总结
在本文中我们实现了查询的分页,关于分页更详细的说明请参考官方文档:Pagination。那么GraphQL的查询部分就说完了,下一篇文章将会介绍如何进行数据的修改。
相关文章推荐
- 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 在Delphi 和 .NET中 实现分页功能的存储过程(返回多个记录集)
- .Net中使用MailMessage和SmtpClient完成调用三方邮箱服务,实现接入邮箱发件功能
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 使用Hibernate3实现分页功能
- 使用hibernate和struts2实现分页功能
- 使用struts2 hibernate spring整合实现新闻信息管理系统案例-实现新闻信息分页显示功能
- 使用Hibernate3实现分页功能
- .NET基于分页控件实现真分页功能
- 模拟网易邮箱实现全选,全不的功能/使用DataList实现 加入购物车,编辑,删除,更新,取消功能。/试完成Datalist使用存储过程来分页
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【七】——实现资源的分页
- 在django中使用自定义标签实现分页功能
- 在django中使用自定义标签实现分页功能
- Android使用AsyncQueryHandler实现获取手机联系人功能
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 使用ant实现svn管理得eclipse插件开发项目的日构建功能(ant1.7.1+svn1.6.3+eclipse3.4.2)
- 使用.net FtpWebRequest 实现FTP常用功能
- 使用Hibernate3实现分页功能
- 使用用户控件AspNetPager+Gridview实现分页功能