GraphQL 中的字段选择(投影)

在 GraphQL 中,请求的字段确切定义了数据 API 生成器(DAB)返回的内容,不多,也不少。 DAB 将这些选择编译为参数化 SQL,包括仅请求的映射(公开)列,以及它必须在内部提取的任何额外列。 这些列可能包括关系(外键)、主键或分页和游标构造中使用的稳定排序所需的列。

注释

GraphQL 没有通配符,如下所示 SELECT *。 客户端必须显式指定每个字段。

转到 本文档的 REST 版本

基本选择

查询几个映射字段。

GraphQL 查询

query {
  books {
    items {
      id
      title
      price
    }
  }
}

概念 SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

示例响应

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "price": 20
        }
      ]
    }
  }
}

字段别名

别名重命名响应中的字段,而不是数据库中的字段。 SQL 层不为 GraphQL 字段名称别名;在数据检索后发生别名。

query {
  books {
    items {
      id
      bookTitle: title
      cost: price
    }
  }
}

概念 SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

示例响应

使用别名:

{
  "data": {
    "books": {
      "items": [
        {
          "id": 2,
          "bookTitle": "Foundation",
          "cost": 18
        }
      ]
    }
  }
}

嵌套选择

配置中定义的关系允许嵌套查询。 下面的概念 SQL 显示了单个联接。 实际上,DAB 可以执行一个或多个参数化查询(例如,父查询加上批处理子提取),而不是单个平展联接。

GraphQL 查询

query {
  books {
    items {
      id
      title
      category {
        id
        name
      }
    }
  }
}

概念 SQL

SELECT
  b.id,
  b.sku_title AS title,
  c.id AS category_id,
  c.name AS category_name
FROM dbo.books AS b
JOIN dbo.categories AS c
  ON b.category_id = c.id;

示例响应

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        },
        {
          "id": 2,
          "title": "Foundation",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        }
      ]
    }
  }
}

一对多选择

还可以遍历反关系。 同样,SQL 是概念性的;实际执行可能会删除父行并单独具体化子集合。

GraphQL 查询

query {
  categories {
    items {
      id
      name
      books {
        items {
          id
          title
        }
      }
    }
  }
}

概念 SQL

SELECT
  c.id,
  c.name,
  b.id AS book_id,
  b.sku_title AS title
FROM dbo.categories AS c
JOIN dbo.books AS b
  ON c.id = b.category_id;

示例响应

{
  "data": {
    "categories": {
      "items": [
        {
          "id": 10,
          "name": "Sci-Fi",
          "books": {
            "items": [
              { "id": 1, "title": "Dune" },
              { "id": 2, "title": "Foundation" }
            ]
          }
        }
      ]
    }
  }
}

示例配置

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

另请参阅

概念 REST GraphQL 目的
投影 $select 物品 选择要返回的字段
Filtering $filter 滤波器 按条件限制行
排序 $orderby orderBy 定义排序顺序
页面大小 $first first 限制每页的项数
延续 $after 使用光标从最后一页继续

注释

REST 关键字以 $遵循 OData 约定开头。