Возможно ли в GraphQL структурировать запрос для получения целого числа или массива целых чисел? - PullRequest
1 голос
/ 06 февраля 2020

У меня такое ощущение, что он должен быть строго напечатан, так или иначе, и мне любопытно, если я смогу выполнить sh оба с одним и тем же запросом, я бы хотел что-то вроде этого:

{
  accounts(accountId: [1,2,3]) {
    ...
  }
}

А также можно сделать тот же вызов, считая его простым int:

{
  accounts(accountId: 1) {
    ...
  }
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Список - это тип переноса, который переносит другого типа, но сам по себе это отдельный тип. Так что Int и [Int] - это два разных типа. Поле или аргумент должны иметь ровно один тип, поэтому он может иметь только тип Int или тип [Int] - но не оба.

Однако вы можете использовать как GraphQL Приводит список входных значений. Из spe c:

Если значение, переданное в качестве входных данных для типа списка, не является списком и не является нулевым значением, то результатом приведения ввода является список первого размера, где значение отдельного элемента является результатом приведения ввода для типа элемента списка по предоставленному значению (обратите внимание, что это может применяться рекурсивно для вложенных списков).

Другими словами, если тип accountId равно [Int] (или [Int!] или [Int!]!), клиент все равно может передавать одно целое число в качестве значения вместо массива. В этом случае значение будет принудительно в массив с одним значением (которое было передано).

1 голос
/ 11 февраля 2020

Чтобы расширить ответ Дэниела Рирдона: к сожалению, невозможно запросить одно и то же поле с разными аргументами. В этой ситуации рекомендуется использовать псевдонимы:

https://graphql.org/learn/queries/#aliases

Однако вы можете настроить свой API так, чтобы он возвращал разные результаты на основе массива, который вы ' переходит к нему. Так, например, вы можете вернуть только одну запись, если в массиве только один элемент, много, если их много, или все записи, если массив пуст.

Вот некоторый гипотетический код того, как это может выглядеть:

public IEnumerable<Accounts> GetAccounts(int[] accountIds)
{
    // if no items in array
    if (accountIds.Length == 0)
    {
        // return all accounts
        return Accounts.ToList();
    }

    // return only accounts that are in accountIds array
    // if only one item is in array, then an IEnumerable with only one item will be returned
    return Accounts
        .Where(b => accountIds.Contains(b.AccountId))
        .ToList();
}

Метод GetCharacters (int [] ids) в Hot Chocolate в примере Star Wars API также будет возвращать только один символ, если передан массив с одним идентификатором или несколько, если в массиве несколько элементов:

public IEnumerable<ICharacter> GetCharacters(int[] ids)
        {
            foreach (int id in ids)
            {
                if (_characters.TryGetValue(id, out ICharacter? c))
                {
                    yield return c;
                }
            }
        }
...