Delen via


Veldselectie (projectie) in GraphQL

In GraphQL definiëren de velden die u aanvraagt precies wat Data API Builder (DAB) retourneert, niet meer, niet minder. DAB compileert deze selecties in geparameteriseerde SQL, inclusief alleen de toegewezen (weergegeven) kolommen die u hebt gevraagd en eventuele extra kolommen die intern moeten worden opgehaald. Dit kunnen kolommen bevatten die vereist zijn voor relaties (refererende sleutels), primaire sleutels of stabiele volgorde die wordt gebruikt in paginering en cursorconstructie.

Opmerking

GraphQL heeft geen jokerteken zoals SELECT *. Clients moeten elk veld expliciet opgeven.

Ga naar de REST-versie van dit document.

Basisselectie

Query's uitvoeren op een aantal toegewezen velden.

GraphQL-query

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

Conceptuele SQL

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

Voorbeeldantwoord

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

Veldaliassen

Aliassen wijzigen de naam van velden in het antwoord, niet in de database. De SQL-laag aliast niet naar GraphQL-veldnamen; aliasing vindt plaats na het ophalen van gegevens.

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

Conceptuele SQL

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

Voorbeeldantwoord

Met aliassen:

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

Geneste selectie

Relaties die in de configuratie zijn gedefinieerd, staan geneste query's toe. In de conceptuele SQL hieronder ziet u één join. In de praktijk kan DAB een of meer geparameteriseerde query's uitvoeren (bijvoorbeeld een bovenliggende query plus een batchgewijs onderliggend ophalen) in plaats van één platgemaakte join.

GraphQL-query

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

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

Voorbeeldantwoord

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

Een-op-veel-selectie

U kunt ook de inverse relatie doorlopen. Sql is opnieuw conceptueel. de werkelijke uitvoering kan bovenliggende rijen ontdubbelen en onderliggende verzamelingen afzonderlijk materialiseren.

GraphQL-query

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

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

Voorbeeldantwoord

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

Voorbeeldconfiguratie

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

Zie ook

Concept REST GraphQL Purpose
Projection $select Items Kiezen welke velden u wilt retourneren
Filtering $filter filteren Rijen beperken op voorwaarde
Sorteervolgorde $orderby orderBy De sorteervolgorde definiëren
Paginaformaat $first first Het aantal items per pagina beperken
Voortzetting $after na Doorgaan vanaf de laatste pagina met behulp van een cursor

Opmerking

REST-trefwoorden beginnen met $het volgen van OData-conventies.