使用 HotChocolate 查询组织

Query organization with HotChocolate

我正在尝试以这种方式组织我的查询

public class RootQueryType : ObjectType
    {
        protected override void Configure(IObjectTypeDescriptor descriptor)
        {
            descriptor.Include<UserQuery>().Name("userQuery");

            descriptor.Include<MessageQuery>().Name("messageQuery");
        }
    }

但在我的 Altair 操场上,我最终得到了这个:

没有userQuery,但我仍然可以从中查询字段。我认为这不是 Include 的工作方式,我正在寻找一种方法来分离 messageQuery 和 userQuery。

Include 将包含类型的所有字段合并到当前类型中。 Name 指的是当前类型的名称。为了在您的类型中获得另一个级别,只需创建一个 returns 新类型的字段。

您知道吗,您不需要这些类型描述符,而是可以用纯 C# 表达一切。

public class Query 
{
    public UserQuery GetUsers() => new UserQuery();
}

public class UserQuery 
{
    ...
}

这将导致:

type Query {
  users: UserQuery
}

type UserQuery {
  # ...
}

Include returns IObjectTypeDescriptor 所以你正在做的是设置 RootQueryType

的名称

如果我理解正确的话,你希望能够像这样查询:

{
    userQuery {
      userName
    }
    messageQuery {
      message
    }
}
public class RootQueryType : ObjectType
    {
        protected override void Configure(IObjectTypeDescriptor descriptor)
        {
            descriptor.Field("userQuery").Resolve(new UserQuery())
            descriptor.Field("messageQuery").Resolve(new MessageQuery())
        }
    }

如果您想实际组合这些类型,并能够创建这样的查询:

  
{ 
    userName  
    message 
}

您可以使用ObjectTypeExtensions

[ExtendObjectType("Query")]
public class UserQuery {
    public string GetUserName() => ...
  
}
[ExtendObjectType("Query")]
public class MessageQuery {
    public string Message() => ...
  
}

然后你可以做

services.AddGraphQLServer()
   .AddQueryType(x => x.Name("Query"))
   .AddTypeExtension<UserQuery>()
   .AddTypeExtension<MessageQuery>()