使用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
項目,調用介面:
可以看到在返回體中,只包含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
作為過濾的條件來展示,實際上可以進行過濾的條件有很多:
總結
在本文中我們實現了查詢過濾,下一篇文章將會介紹如何進行查詢數據的排序。