web-dev-qa-db-ja.com

GraphQL .NETで、クエリがオプションのパラメーターを取ることができるように指定するにはどうすればよいですか?

ユーザーの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に2つの引数を指定することは、クエリに両方の引数が必要であることを意味しますか?

9
Dylan Cristy
_arguments: new QueryArguments(
  new QueryArgument<IntGraphType>() { Name = "id" },
  new QueryArgument<StringGraphType>() { Name = "email" }
)
_

これは、これらの引数がnull許容であることを意味し、オプションになります。

_arguments: new QueryArguments(
  new QueryArgument<NonNullGraphType<IntGraphType>>() { Name = "id" },
  new QueryArgument<NonNullGraphType<StringGraphType>>() { Name = "email" }
)
_

GraphTypeNonNullGraphTypeでラップすると、値がnull以外である必要があるため、null以外の値を指定する必要があります。

デフォルトでは、引数が存在しない場合、_GetArgument<TType>_はdefault(TType)を返します。次のものも使用できます。

_context.GetArgument<string>("email", defaultValue: "my default value");
_
8
Joe McBride