0

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

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

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

但在我的 Altair 操场上,我得到了这样的结果: Altair 文档

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

4

2 回答 2

3

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

您是否知道您不需要这些类型描述符,但可以使用纯 C# 来表达所有内容。

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

public class UserQuery 
{
    ...
}

这将导致:

type Query {
  users: UserQuery
}

type UserQuery {
  # ...
}
于 2021-03-28T18:38:25.000 回答
1

Include返回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>()
   
于 2021-03-28T18:45:25.490 回答