Condividi tramite


Selezione dei campi (proiezione) in GraphQL

In GraphQL i campi richiesti definiscono esattamente ciò che il generatore di API dati (DAB) restituisce, non più, non meno. DAB compila queste selezioni in SQL con parametri, incluse solo le colonne mappate (esposte) richieste e le eventuali colonne aggiuntive che deve recuperare internamente. Queste possono includere colonne necessarie per le relazioni (chiavi esterne), chiavi primarie o ordinamento stabile usate nella costruzione di pagine e cursori.

Annotazioni

GraphQL non ha caratteri jolly come SELECT *. I client devono specificare ogni campo in modo esplicito.

Passare alla versione REST di questo documento.

Selezione di base

Esecuzione di query su alcuni campi mappati.

Query GraphQL

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

SQL concettuale

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

Risposta di esempio

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

Alias di campo

Gli alias rinominano i campi nella risposta, non nel database. Il livello SQL non esegue l'alias per i nomi dei campi GraphQL; l'aliasing si verifica dopo il recupero dei dati.

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

SQL concettuale

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

Risposta di esempio

Con alias:

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

Selezione annidata

Le relazioni definite nella configurazione consentono query annidate. Il codice SQL concettuale seguente mostra un singolo join. In pratica, DAB può eseguire una o più query con parametri (ad esempio, una query padre più un recupero figlio in batch) anziché un singolo join bidimensionale.

Query GraphQL

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

SQL concettuale

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;

Risposta di esempio

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

Selezione uno-a-molti

È anche possibile attraversare la relazione inversa. Anche in questo caso, SQL è concettuale; l'esecuzione effettiva può deduplicare le righe padre e materializzare le raccolte figlio separatamente.

Query GraphQL

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

SQL concettuale

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;

Risposta di esempio

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

Configurazione di esempio

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

Vedere anche

Concetto REST GraphQL Scopo
Projection $select Elementi Scegliere i campi da restituire
Filtraggio $filter filtro Limitare le righe per condizione
Ordinamento $orderby orderBy Definire l'ordinamento
Dimensioni pagina $first primo Limitare il numero di elementi per pagina
Continuazione $after dopo Continuare dall'ultima pagina usando un cursore

Annotazioni

Le parole chiave REST iniziano con $, seguendo le convenzioni OData.