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

时间:2018-06-19 18:52:44

标签: graphql graphql-dotnet

假设我希望能够通过指定用户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 个答案:

答案 0 :(得分:3)

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");