Partilhar via


Paginação com after no GraphQL

A paginação restringe grandes conjuntos de dados a páginas menores e gerenciáveis. No GraphQL, o construtor de API de dados (DAB) usa o argumento para paginação do conjunto de chaves, fornecendo uma travessia after estável e eficiente através de resultados ordenados. Cada cursor codifica a posição do último registro na página anterior, permitindo que a próxima consulta continue a partir desse ponto. Ao contrário da paginação de deslocamento, a paginação do conjunto de chaves evita lacunas ou duplicações quando os dados são alterados entre as solicitações.

Vá para a versão REST deste documento.

Visão rápida

Concept Description
after O token de continuação da solicitação anterior
first O número máximo de registros a serem buscados por página
hasNextPage Indica se existem mais dados
endCursor O token a ser incluído na próxima after solicitação

Paginação básica

Consulta GraphQL

Neste exemplo, temos os três primeiros livros.

query {
  books(first: 3) {
    items {
      id
      title
    }
    hasNextPage
    endCursor
  }
}

SQL conceitual

SELECT TOP (3)
  id,
  sku_title AS title
FROM dbo.books
ORDER BY id ASC;

Resposta da amostra

{
  "data": {
    "books": {
      "items": [
        { "id": 1, "title": "Dune" },
        { "id": 2, "title": "Foundation" },
        { "id": 3, "title": "Hyperion" }
      ],
      "hasNextPage": true,
      "endCursor": "eyJpZCI6M30="
    }
  }
}

Continuação com after

O after argumento especifica o token de continuação para a próxima página. O valor é um cursor codificado em base64 que representa o último registro da página anterior.

Advertência

O after argumento carrega um token opaco que marca onde a página anterior terminou. Trate os tokens como imutáveis e nunca tente construí-los ou editá-los.

Neste exemplo, estamos recebendo os próximos três livros após o cursor da última página.

Consulta GraphQL

query {
  books(first: 3, after: "eyJpZCI6M30=") {
    items {
      id
      title
    }
    hasNextPage
    endCursor
  }
}

SQL conceitual

SELECT TOP (3)
  id,
  sku_title AS title
FROM dbo.books
WHERE id > 3
ORDER BY id ASC;

Resposta da amostra

{
  "data": {
    "books": {
      "items": [
        { "id": 4, "title": "I, Robot" },
        { "id": 5, "title": "The Left Hand of Darkness" },
        { "id": 6, "title": "The Martian" }
      ],
      "hasNextPage": true,
      "endCursor": "eyJpZCI6Nn0="
    }
  }
}

Paginação aninhada

A paginação pode ser aplicada a coleções relacionadas, como recuperar autores com uma lista paginada de livros.

Consulta GraphQL

query {
  authors {
    items {
      id
      name
      books(first: 2) {
        items {
          id
          title
        }
        hasNextPage
        endCursor
      }
    }
  }
}

SQL conceitual

-- parent
SELECT
  id,
  name
FROM dbo.authors;

-- child
SELECT TOP (2)
  author_id,
  id,
  sku_title AS title
FROM dbo.books
WHERE author_id IN (@a1, @a2)
ORDER BY id ASC;

Observação

Qualquer alteração de esquema ou pedido invalida tokens emitidos anteriormente. Os clientes devem reiniciar a paginação a partir da primeira página.

Configuração de exemplo

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

Consulte também

Concept REST GraphQL Propósito
Projection $select items Escolha quais campos retornar
Filtering $filter filtrar Restringir linhas por condição
Classificação $orderby orderBy Definir a ordem de classificação
Tamanho da página $first first Limitar o número de itens por página
Continuação $after após Continue a partir da última página usando um cursor

Observação

As palavras-chave REST começam com $, seguindo as convenções OData.