在 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<TType>
将返回default(TType)
。你也可以使用:
context.GetArgument<string>("email", defaultValue: "my default value");
【讨论】:
所以如果参数不存在,我可以强制GetArgument<TType>
返回 null
通过执行 context.GetArgument<string>("email", defaultValue: null)
?
是的。提供默认值是可选的(defaultValue
是可选参数)。字符串的默认值为 null。以上是关于在 GraphQL .NET 中,如何指定查询可以采用可选参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 aws amplify 中使用 graphQL 限制