【问题标题】:Is it possible in GraphQL to structure a Query to expect an Integer, or an array of Integers?在 GraphQL 中是否可以构造一个查询以期望一个整数或一个整数数组?
【发布时间】:2020-02-06 15:56:59
【问题描述】:

我有一种感觉,它必须是强类型的,一种或另一种,并且很好奇我是否可以用相同的查询完成这两种操作,我想要这样的东西:

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

并且还能够进行同样的调用,将其视为普通 int:

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

【问题讨论】:

    标签: graphql hotchocolate


    【解决方案1】:

    List 是一种包装类型,它包装另一种类型,但它本身是一种不同的类型。所以Int[Int] 是两种不同的类型。字段或参数必须只有一种类型,因此它只能具有 Int 类型 [Int] 类型 -- 不能两者兼有。

    但是,您可以利用 GraphQL 如何强制列表输入值。来自规范:

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

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

    【讨论】:

      【解决方案2】:

      扩展 Daniel Reardon 的回答:不幸的是,不可能使用不同的参数查询相同的字段。针对这种情况的推荐技术是使用别名:

      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();
      }
      

      Hot Chocolate's GetCharacters(int[] ids) method in the Star Wars API example 也将只返回一个字符,如果一个数组只有一个 ID,如果数组中有多个项目,则返回多个:

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

      【讨论】:

        猜你喜欢
        • 2015-01-26
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多