共用方式為


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 目標
Projection $select 項目 選擇要傳回的欄位
篩選 $filter 篩選 依條件限制資料列
排序 $orderby orderBy 定義排序順序
頁面大小 $first first 限制每頁的項目數
繼續 $after 使用游標從最後一頁繼續

備註

REST 關鍵字會遵循 OData 慣例,以 開 $頭。