Gestione della paginazione
Caso: esportare tutte le testate documento in un data warehouse.
Algoritmo
PageNumber = 1,PageSize= dimensione scelta.- Leggi la pagina. Se è vuota, hai finito.
- Dal primo record ricava
TotalRowsCounte calcolapagine = ceil(TotalRowsCount / PageSize). - Incrementa
PageNumberfinché non arrivi apagine.
- C#
- JavaScript
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();
}
}
export async function* readAll(resource, filter, pageSize = 500) {
for (let page = 1, pages = 1; page <= pages; page++) {
const qs = new URLSearchParams({ PageSize: pageSize, PageNumber: page });
if (filter) qs.set("RecordSelection", filter);
const rows = await get(`/api/resources/${resource}?${qs}`);
if (rows.length === 0) return;
if (page === 1) pages = Math.ceil(rows[0].TotalRowsCount / pageSize);
yield* rows;
}
}
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.