首页 > 解决方案 > graphql-dotnet 按操作名称查询

问题描述

我正在使用graphql-dotnet在 Net Core 2.2 Web API 中构建 graphql 服务器。

架构说明:

我有一个ObjectGraphType喜欢下面

public class UserType
        : ObjectGraphType<Users>
    {
        public UserType()
        {
            Field(x => x.ContactNumber);
            Field(x => x.Email, true);
            Field(x => x.Fax);    
        }
    }
}

我有一个查询定义,例如

public class UserOperationNameQuery
         : ObjectGraphType
    {
        public UserOperationNameQuery()
        {
            Name = "getAllUsers";
            Field<ListGraphType<UserType>>(name: "items", description: "Get all users",
            resolve: context =>
            {
               // resolver
            });
        }

我的架构是

public class GraphQLSchema
        : Schema
    {
        public GraphQLSchema(IDependencyResolver resolver) 
            : base(resolver)
        {            
            Query = resolver.Resolve<UserOperationNameQuery>();
        }
    }

我的控制器方法是:

        [HttpPost]
        public async Task<IActionResult> Post([FromBody] GraphQLQuery query)
        {
            if (query == null) { throw new ArgumentNullException(nameof(query)); }
            var inputs = query.Variables.ToInputs();
            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query = query.Query,
                Inputs = inputs,
                OperationName = query.OperationName,                
            };

            var result = await _documentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return BadRequest(result);
            }

            return Ok(result);
        }

询问:

我发送此查询

query getAllUsers
{
    items {
      email
  }
}

这是作品。
但是,如果我更改任何值的操作名称,查询也会执行并获得用户。

query getAllCompanies
{
    items {
      email
  }
}

我可以在请求中写入任何操作名称,它将成功执行。


我只想通过某些操作名称(在我的情况下getAllUsers)询问用户,我可以在定义的架构中设置某处。如果我跳过操作名称,则不应执行请求。

我该怎么做?

标签: c#graphqlgraphql-dotnet

解决方案


您将 getAllUsers() 映射到错误的位置,您应该将该方法映射为 RootQuery 中的 ListGraphType,然后当您调用类似这样的内容时,它应该返回所有用户。

query getAllUsers
   {
   users
   items {
     email
        }
   }

注意查询getAllUsers是任意的,你可以改成查询getWhatEver,还是会得到同样的结果。但是通过上面的这个 graphql 查询,您将返回一个包含项目字段的用户列表,并且项目具有一个电子邮件字段。如果您只想返回一个对象,则需要映射一个 UserType 字段,该字段本质上将返回您正在寻找的对象。

如果你这样写,查询也将在没有查询 GetAllUsers 的情况下执行

   {
   users
   items {
     email
        }
   }

再次检查文档和示例以获得更多说明。


推荐阅读