使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能

  • A+
所属分类:.NET技术
摘要

使用Hot Chocolate和.NET 6构建GraphQL应用文章索引从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询中的另一个需求:排序。


系列导航

使用Hot Chocolate和.NET 6构建GraphQL应用文章索引

需求

从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询中的另一个需求:排序。

思路

Hot Chocolate提供了UseSorting属性来用于构造包含查询过滤的SQL语句,所以我们直接使用就好了。

实现

要使用Sorting属性,需要先在添加服务依赖注入的时候指定:

  • ProgramExtension.cs
builder.Services     .AddGraphQLServer()     .AddFiltering()     .AddProjections()     .AddSorting()     .AddQueryType<Query>()     .AddType<PostType>(); 

然后在接口上方添加UseSorting即可,注意属性添加的顺序。

  • Query.cs
[UseProjection] [UseFiltering] [UseSorting] public IQueryable<Post> GetPosts([Service] IRepository<Post> repository) => repository.GetAsQueryable(); 

这样就实现了查询结果的排序,下面我们来验证一下。

验证

启动Api项目,调用接口:

使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能

可以看到在返回体中数据已经按title升序排列了,我们再来看一下控制台输出的EF Core日志:

[15:17:55 INF] Executed DbCommand (6ms) [Parameters=[@__p_0='?' (Size = 7)], CommandType='Text', CommandTimeout='30'] SELECT "p"."Id", "p"."Title", "p"."Author", "c"."Content", "c"."Id", "t0"."Name", "t0"."PostsId", "t0"."TagsId", "t0"."Id" FROM "Posts" AS "p" LEFT JOIN "Comments" AS "c" ON "p"."Id" = "c"."PostId" LEFT JOIN (     SELECT "t"."Name", "p0"."PostsId", "p0"."TagsId", "t"."Id"     FROM "PostTag" AS "p0"     INNER JOIN "Tags" AS "t" ON "p0"."TagsId" = "t"."Id" ) AS "t0" ON "p"."Id" = "t0"."PostsId" WHERE (@__p_0 = '') OR (instr("p"."Title", @__p_0) > 0) ORDER BY "p"."Title", "p"."Id", "c"."Id", "t0"."PostsId", "t0"."TagsId" [15:17:55 INF] Executed endpoint 'Hot Chocolate GraphQL Pipeline' 

从日志中可以看到Hot Chocolate已经为生成的SQL语句添加了Order排序子句了,在示例中我们选择了title(ASC)作为排序的条件来展示。

总结

在本文中我们实现了查询排序,下一篇文章将会介绍如何进行查询数据的分页功能。