使用Hot Chocolate和.NET 6構建GraphQL應用(6) —— 實現Query排序功能

系列導航

使用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項目,調用介面:

img

可以看到在返回體中數據已經按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)作為排序的條件來展示。

總結

在本文中我們實現了查詢排序,下一篇文章將會介紹如何進行查詢數據的分頁功能。