使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能
2022-01-29 09:59
1126 查看
系列导航
使用Hot Chocolate和.NET 6构建GraphQL应用文章索引
需求
在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) —— 实现Query基础功能中,我们留了两个问题,一是通过GraphQL接口返回的Posts结果并没有获取到关联的Comment和Tag内容,二是返回结果没有进行排序。在这篇文章中,我们先来解决第一个问题。
思路
要获取关联实体,使用EF Core自然会想到在进行Query的时候添加一下Include语句就可以了,这种方式虽然可以实现,但是这其实并不太符合GraphQL接口的风格。GraphQL本身就是将数据对象作为图中的顶点以及其邻接点来看待的。所以我们不会修改接口本身的逻辑,通过Hot Chocolate为我们提供的映射(Projection)属性来完成需求。
实现
要使用Projection属性,需要先在添加服务依赖注入的时候指定:
ProgramExtension.cs
builder.Services .AddGraphQLServer() .AddProjections() .AddQueryType<Query>() .AddType<PostType>();
然后在接口上方添加
UseProjection即可:
Query.cs
[UseProjection] public IQueryable<Post> GetPosts([Service] IRepository<Post> repository) => repository.GetAsQueryable();
这样就实现了关联实体的获取,非常简单,下面我们来验证一下。
验证
启动
Api项目,调用接口:
可以看到Comment和Tag信息已经出现在返回体中了,我们再来看一下控制台输出的EF Core日志:
[09:48:40 INF] Executing endpoint 'Hot Chocolate GraphQL Pipeline' [09:48:40 WRN] Compiling a query which loads related collections for more than one collection navigation, either via 'Include' or through projection, but no 'QuerySplittingBehavior' has been configured. By default, Entity Framework will use 'QuerySplittingBehavior.SingleQuery', which can potentially result in slow query performance. See https://go.microsoft.com/fwlink/?linkid=2134277 for more information. To identify the query that's triggering this warning call 'ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))'. [09:48:40 INF] Executed DbCommand (2ms) [Parameters=[], 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" ORDER BY "p"."Id", "c"."Id", "t0"."PostsId", "t0"."TagsId" [09:48:40 INF] Executed endpoint 'Hot Chocolate GraphQL Pipeline'
从日志中可以看到Hot Chocolate告诉我们加载多个关联实体集合的时候要么通过
Include方式,要么使用
Projection,但是在没有应用任何
QuerySplittingBehavior的情况下,会默认使用
QuerySplittingBehavior.SingleQuery方式,可能会导致慢查询,具体的说明也给出了链接,有兴趣的小伙伴可以看一下。
然后就是实际执行的SQL语句了,可以看到这次的SQL语句明显进行了关联对象之间的Join操作,所以能得到我们希望的结果。
总结
在本文中我们实现了关联对象的获取,下一篇文章将会介绍如何进行查询数据的过滤。
相关文章推荐
- 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能
- 使用Hot Chocolate和.NET 6构建GraphQL应用(5) —— 实现Query过滤功能
- 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据
- 使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能
- 在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能
- 使用.net FtpWebRequest 实现FTP常用功能收藏
- 使用.net FtpWebRequest 实现FTP常用功能
- 使用React,GraphQL和用户身份验证构建运行状况跟踪应用
- 使用ant实现svn管理得eclipse插件开发项目的日构建功能(ant1.7.1+svn1.6.3+eclipse3.4.2)
- Android应用开发之使用PhoneGap(cordova)实现拍照上传功能
- 构建NetCore应用框架之实战篇(五):BitAdminCore框架1.0登录功能设计实现及源码
- 使用.net FtpWebRequest 实现FTP常用功能
- [置顶] ExtJs4.2应用:使用ExtJs扩展组件searchfield实现数据搜索功能
- Java NIO 应用 -- 使用内存映射文件实现进程间通信
- 安卓使用腾讯Bugly实现应用升级功能
- 使用.net Remoting技术构建应用系统架构系列(1)
- Ajax应用:使用jQuery和PHP实现功能开关效果
- 使用Command模式实现应用的撤销功能
- 【凯子哥带你夯实应用层】使用ActionMode实现有删除动画的多选删除功能
- C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能