问题描述
我正致力于将设计粗糙的 REST API 转换为具有 Entity Framework Core 和 Hot Chocolate 的流畅 GraphQL API。
我目前正在通过 UseProjection
公开我的整个数据库。
我的数据库包含一个表 Foo
,表 Bar
的外键具有属性 Baz
。
目前公开为:
Foo {
Bar {
Baz
}
}
就我而言,Foo
和 Bar
是 1:1 的关系。
我想从 API 中隐藏 Bar
,并公开以下内容:
Foo {
Baz
}
descriptor
.Field("Baz")
.Resolve(ctx => ctx.Parent<Foo>().Bar?.Baz);
如果我运行的查询在两个级别访问 Baz
,那么 GQL 会在两个级别正确返回 Baz
。但是,如果我省略 3 级请求,则 sql 调用永远不会从数据库中拉取 Baz
,因此 2 级请求返回 null
。
Hot Chocolate docs 表示您可以通过添加以下内容来解决此问题:
descriptor
.Field(Foo => Foo.Bar)
.IsProjected(true);
但是,当我使用此代码运行查询时,我收到错误 A composite type always needs to specify a selection set
。所以我不仅需要告诉Hot Chocolate投影Bar
,还要在Bar
中指定一组字段?我该怎么做?
附言我可以通过向查询显式添加字段来解决上述错误,但我不想污染我的查询。
PPS 我也可以通过使用 DataLoader 解析 Foo.Bar
来实现,但是由于我有大约 1k 个 Foo
,每个都有一个唯一的 Bar
和唯一的 Baz
,所以将需要 ~1k 数据库调用。我想在一个电话中完成这项工作。
Hot Chocolate v11,netcore3.1
编辑
IsProjected(true)
旨在用于属性,而不是表。问题变成了,如何跨表投影到属性中?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)