如何在 Hot Chocolate 中公开不同级别架构的属性

Bra*_*Cok 12 .net-core graphql hotchocolate

我正在努力将设计粗劣的 REST API 转换为带有 Entity Framework Core 和 Hot Chocolate 的流畅 GraphQL API。

我目前正在通过 公开我的整个数据库UseProjection。我的数据库包含一个表Foo,该表的外键Bar具有 property Baz

目前这被曝光为:

Foo {
  Bar {
    Baz
  }
}
Run Code Online (Sandbox Code Playgroud)

就我而言,FooBar1:1 的关系。我想隐藏BarAPI,并公开以下内容:

Foo {
  Baz
}
Run Code Online (Sandbox Code Playgroud)

我在 中添加了以下内容FooType.cs

descriptor
    .Field("Baz")
    .Resolve(ctx => ctx.Parent<Foo>().Bar?.Baz);
Run Code Online (Sandbox Code Playgroud)

Baz 如果我运行在两个级别进行访问的查询,则 GQLBaz在两个级别都会正确返回。但是,如果我省略 3 级请求,则 SQL 调用永远不会Baz从数据库中提取,因此 2 级请求返回null.

热巧克力文档说你可以通过添加以下内容来解决这个问题:

descriptor
    .Field(Foo => Foo.Bar)
    .IsProjected(true);
Run Code Online (Sandbox Code Playgroud)

但是,当我使用此代码运行查询时,我收到错误A composite type always needs to specify a selection set。所以我不仅需要告诉 Hot Chocolate 进行项目,还需要在?Bar中指定一组字段。Bar我怎么做?

PS 我可以通过显式向查询添加字段来解决上述错误,但我不想污染我的查询。

PPS 我也可以通过Foo.Bar使用 DataLoader 进行解析来做到这一点,但由于我有 ~1k Foos,每个都有一个 uniqueBar和 unique Baz,这将需要 ~1k 数据库调用。我想通过一次通话完成此操作。

热巧克力 v11,netcore3.1

编辑

IsProjected(true)旨在用于属性,而不是表。问题是,如何将表格投影到属性中?

小智 0

也许您需要告诉 EF “自动包含”您的导航属性Bazhttps://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.metadata.builders.navigationbuilder.autoinclude ?view=efcore-6.0

前任:

public class BarConfig : IEntityTypeConfiguration<Bar>
{
    public void Configure(EntityTypeBuilder<Bar> builder)
    {
        builder.Navigation(x => x.Baz).AutoInclude();
    }
}
Run Code Online (Sandbox Code Playgroud)