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

系列導航

使用Hot Chocolate和.NET 6構建GraphQL應用文章索引

需求

對於查詢來說,還有一大需求是針對查詢的數據進行過濾,本篇文章我們準備實現GraphQL中基本的查詢過濾。

思路

Hot Chocolate提供了UseFiltering屬性來用於構造包含查詢過濾的SQL語句,所以我們直接使用就好了。

實現

要使用Filtering屬性,需要先在添加服務依賴注入的時候指定:

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

然後在介面上方添加UseProjection即可,注意屬性添加的順序。

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

這樣就實現了查詢的過濾,非常簡單,下面我們來驗證一下。

驗證

啟動Api項目,調用介面:

img

可以看到在返回體中,只包含Title內含有graphql的結果了,我們再來看一下控制台輸出的EF Core日誌:

[22:43:08 INF] Executing endpoint 'Hot Chocolate GraphQL Pipeline'
[22:43:08 INF] Executed DbCommand (0ms) [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"."Id", "c"."Id", "t0"."PostsId", "t0"."TagsId"
[22:43:08 INF] Executed endpoint 'Hot Chocolate GraphQL Pipeline'

從日誌中可以看到Hot Chocolate已經為生成的SQL語句添加了Where查詢子句了,在示例中我們選擇了contains作為過濾的條件來展示,實際上可以進行過濾的條件有很多:

img

總結

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