Как в GraphQL .NET указать, что запрос может принимать необязательные параметры?

Скажем, я хочу иметь возможность запрашивать пользователя, указав его идентификатор, или же, указав другой идентификатор, например адрес электронной почты.

Как вы создаете корневой объект 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 означает, что для запроса требуются оба аргумента?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
13
0
4 393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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" }
)

Обертывание GraphType в NonNullGraphType указывает, что значение не должно быть нулевым, что требует предоставления ненулевого значения.

По умолчанию GetArgument<TType> вернет default(TType), если аргумент не существует. Вы также можете использовать:

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

Итак, я мог бы заставить GetArgument<TType> вернуть null, если аргумент не существует, выполнив context.GetArgument<string>("email", defaultValue: null)?

Dylan Cristy 20.06.2018 18:13

Да. Указывать значение по умолчанию необязательно (defaultValue - необязательный параметр). По умолчанию для строки будет null.

Joe McBride 20.06.2018 21:30

Другие вопросы по теме