在 GraphQL .NET 中,如何指定查询可以采用可选参数?
In GraphQL .NET, how do I specify that a query can take optional parameters?
假设我希望能够通过指定用户 ID 来查询用户, 或 通过指定其他标识符(例如电子邮件地址)来查询用户。
如何构造根查询对象来接受它?
鉴于此
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()
return null
会吗?还是向 QueryArguments
提供两个参数意味着查询需要两个参数?
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>
将 return default(TType)
。您还可以使用:
context.GetArgument<string>("email", defaultValue: "my default value");
假设我希望能够通过指定用户 ID 来查询用户, 或 通过指定其他标识符(例如电子邮件地址)来查询用户。
如何构造根查询对象来接受它?
鉴于此
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()
return null
会吗?还是向 QueryArguments
提供两个参数意味着查询需要两个参数?
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>
将 return default(TType)
。您还可以使用:
context.GetArgument<string>("email", defaultValue: "my default value");