Passa al contenuto principale

Gestione della paginazione

Caso: esportare tutte le testate documento in un data warehouse.

Algoritmo​

  1. PageNumber = 1, PageSize = dimensione scelta.
  2. Leggi la pagina. Se è vuota, hai finito.
  3. Dal primo record ricava TotalRowsCount e calcola pagine = ceil(TotalRowsCount / PageSize).
  4. Incrementa PageNumber finché non arrivi a pagine.
public async IAsyncEnumerable<JsonElement> ReadAllAsync(string resource, string? filter = null, int pageSize = 500)
{
for (int page = 1, pages = 1; page <= pages; page++)
{
var url = $"api/resources/{resource}?PageSize={pageSize}&PageNumber={page}"
+ (filter is null ? "" : $"&RecordSelection={Uri.EscapeDataString(filter)}");
using var doc = JsonDocument.Parse(await GetStringAsync(url));
var rows = doc.RootElement;
if (rows.GetArrayLength() == 0) yield break;
if (page == 1)
pages = (int)Math.Ceiling(rows[0].GetProperty("TotalRowsCount").GetInt32() / (double)pageSize);
foreach (var row in rows.EnumerateArray()) yield return row.Clone();
}
}

Consigli​

  • Filtra prima di paginare: vedi Filtri.
  • Se i dati cambiano durante la lettura le pagine possono spostarsi: per esportazioni coerenti usa la sincronizzazione incrementale basata su LastUtcRun.