Query Organization
In GraphQL there is only a single root Query object. This can make your root objects bloat with unrelated functionality. You can group sets of functionality by adding a top level group. You can apply this same trick to mutations and subscriptions.
type Query { customer(id: ID): Customer order(id: ID): Order products: [Product] }public class Query : ObjectGraphType { public Query() { Name = "Query"; Field<CustomerGraphType>("customer").Arguments(...).Resolve(...); Field<OrderGraphType>("order").Arguments(...).Resolve(...); Field<ListGraphType<ProductGraphType>>("products").Arguments(...).Resolve(...); } }Split into groups.
type Account { customer(id: ID): Customer order(id: ID): Order } type Retail { products: [Product] } type Query { account: Account retail: Retail }The trick is to return an empty object.
public class Query : ObjectGraphType { public Query() { Name = "Query"; Field<AccountGroupGraphType>("account").Resolve(context => new {}); Field<RetailGroupGraphType>("retail").Resolve(context => new {}); } } public class AccountGroupGraphType : ObjectGraphType { public AccountGroupGraphType() { Name = "Account"; Field<CustomerGraphType>("customer").Arguments(...).Resolve(...); Field<OrderGraphType>("order").Arguments(...).Resolve(...); } } public class RetailGroupGraphType : ObjectGraphType { public RetailGroupGraphType() { Name = "Retail"; Field<ListGraphType<ProductGraphType>>("products").Arguments(...).Resolve(...); } }This allows you to separate out your queries into separate source files to keep your code base cleaner. However, it will mean that your queries are 'nested' a layer deeper than before, and you will need to take this into account when querying. For example, the above 'Retail' example, which could be queried in the playground with:
{ products { name } }Will now require
{ retail { products { name } } }