在 GraphQL .NET 中,如何指定查询可以采用可选参数?

Posted

技术标签:

【中文标题】在 GraphQL .NET 中,如何指定查询可以采用可选参数?【英文标题】:In GraphQL .NET, how do I specify that a query can take optional parameters? 【发布时间】:2018-11-28 19:38:12 【问题描述】:

假设我希望能够通过指定用户 ID 来查询用户,通过指定其他标识符(如电子邮件地址)来查询。

你如何构造根 Query 对象来接受它?

鉴于此

public class MyQuery : ObjectGraphType

    public MyQuery(IUserService userService)
    
        Name = "Query";

        Field<UserType>(
            "user",
            arguments: new QueryArguments(
                new QueryArgument<IntGraphType>()  Name = "id" ,
                new QueryArgument<StringGraphType>()  Name = "email" 
            ),
            resolve: context =>
            
                int? id = context.GetArgument<int>("id");
                if (id != null)
                
                    return userService.GetUserById(id);
                
                string email = context.GetArgument<string>("email");
                if (email != null)
                
                    return userService.GetUserByEmail(email);
                
                return null;
            
        );
    

这是正确的做法吗?如果在查询中找不到参数,context.GetArgument() 会返回 null 吗?或者向QueryArguments 提供两个参数是否意味着查询需要两个参数?

【问题讨论】:

【参考方案1】:
arguments: new QueryArguments(
  new QueryArgument<IntGraphType>()  Name = "id" ,
  new QueryArgument<StringGraphType>()  Name = "email" 
)

这意味着这些参数可以为空,这将使它们成为可选的。

arguments: new QueryArguments(
  new QueryArgument<NonNullGraphType<IntGraphType>>()  Name = "id" ,
  new QueryArgument<NonNullGraphType<StringGraphType>>()  Name = "email" 
)

GraphType 包装在NonNullGraphType 中指定该值不应为空,因此需要提供非空值。

如果参数不存在,默认情况下GetArgument&lt;TType&gt; 将返回default(TType)。你也可以使用:

context.GetArgument<string>("email", defaultValue: "my default value");

【讨论】:

所以如果参数不存在,我可以强制 GetArgument&lt;TType&gt; 返回 null 通过执行 context.GetArgument&lt;string&gt;("email", defaultValue: null)? 是的。提供默认值是可选的(defaultValue 是可选参数)。字符串的默认值为 null。

以上是关于在 GraphQL .NET 中,如何指定查询可以采用可选参数?的主要内容,如果未能解决你的问题,请参考以下文章

为部分 graphQL 查询指定缓存策略

如何在 GraphQL 模式中定义嵌套枚举类型

如何在 aws amplify 中使用 graphQL 限制

我如何为 Apollo Client 指定 GraphQL 查询并获取属性出现适当字符串的项目

嵌套查询 GraphQL:语法错误 - iOS

如何在 GraphQL 查询变量中使用数组