Fältval (projektion) i GraphQL

I GraphQL definierar fälten du begär exakt vad Data API Builder (DAB) returnerar, inte mer, inte mindre. DAB kompilerar dessa val till parametriserad SQL, inklusive endast de mappade (exponerade) kolumner som du bad om och eventuella extra kolumner som den måste hämta internt. Dessa kan omfatta kolumner som krävs för relationer (sekundärnycklar), primära nycklar eller stabil ordning som används i sidnumrering och markörkonstruktion.

Anmärkning

GraphQL har inget jokertecken som SELECT *. Klienter måste uttryckligen ange varje fält.

Gå till REST-versionen av det här dokumentet.

Grundläggande markering

Köra frågor mot några mappade fält.

GraphQL-fråga

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

Konceptuell SQL

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

Exempelsvar

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

Fältalias

Alias byter namn på fält i svaret, inte i databasen. SQL-lagret är inte alias för GraphQL-fältnamn. aliasing sker efter datahämtning.

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

Konceptuell SQL

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

Exempelsvar

Med alias:

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

Kapslad markering

Relationer som definieras i konfigurationen tillåter kapslade frågor. Den konceptuella SQL-filen nedan visar en enda koppling. I praktiken kan DAB köra en eller flera parametriserade frågor (till exempel en överordnad fråga plus en batchbaserad underordnad hämtning) i stället för en enda utplattad koppling.

GraphQL-fråga

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

Konceptuell 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;

Exempelsvar

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

En-till-många-markering

Du kan också bläddra i den omvända relationen. Återigen är SQL konceptuellt; faktisk körning kan deduplicera överordnade rader och materialisera underordnade samlingar separat.

GraphQL-fråga

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

Konceptuell 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;

Exempelsvar

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

Exempelkonfiguration

{
  "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" ]
        }
      }
    }
  }
}

Se även

Begrepp REST GraphQL Avsikt
Projection $select items Välj vilka fält som ska returneras
Filtering $filter filtrera Begränsa rader efter villkor
Sortering $orderby orderBy Definiera sorteringsordningen
Sidstorlek $first first Begränsa antalet objekt per sida
Fortsättning $after efter Fortsätt från den sista sidan med hjälp av en markör

Anmärkning

REST-nyckelord börjar med $, enligt OData-konventioner.