在GraphQL中,是否可以将查询构造为期望整数或整数数组?

在GraphQL中,是否可以将查询构造为期望整数或整数数组?,graphql,hotchocolate,Graphql,Hotchocolate,我有一种感觉,它必须是强类型的,一种方式或另一种方式,我很好奇,如果我能用同一个查询完成这两个,我想这样做: { accounts(accountId: [1,2,3]) { ... } } 也可以将其视为普通int进行相同的调用: { accounts(accountId: 1) { ... } } 列表是一种包装另一种类型的包装类型,但它本身是一种独特的类型。所以Int和[Int]是两种不同的类型。字段或参数必须只有一种类型,因此只能有Int类型或[Int

我有一种感觉,它必须是强类型的,一种方式或另一种方式,我很好奇,如果我能用同一个查询完成这两个,我想这样做:

{
  accounts(accountId: [1,2,3]) {
    ...
  }
}
也可以将其视为普通int进行相同的调用:

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

列表是一种包装另一种类型的包装类型,但它本身是一种独特的类型。所以Int和[Int]是两种不同的类型。字段或参数必须只有一种类型,因此只能有Int类型或[Int]类型,而不能同时有这两种类型

但是,您可以利用GraphQL强制列表输入值的方式。根据规范:

如果作为输入传递给列表类型的值不是列表,也不是空值,则输入强制的结果是大小为1的列表,其中单个项值是所提供值上列表项类型的输入强制的结果。注意,这可能递归地应用于嵌套列表


换句话说,如果accountId的类型是[Int]或[Int!]或[Int!!]!,客户端仍然可以将单个整数作为值而不是数组传递。在这种情况下,该值将被强制转换为一个数组,其中包含一个传入的值。

扩展Daniel Reardon的回答:不幸的是,无法使用不同的参数查询同一字段。对于这种情况,建议使用别名:

但是,您可以根据要传递给API的数组,将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();
}
如果只传递一个ID的数组,则只返回一个字符;如果数组中有多个项,则返回多个字符:

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