Isn't it possible to simply cache the thousands of records somewhere to avoid calling the database each time
Sì, ma è esattamente l'opposto di essere stateless , che è REST. Stai cercando di andare contro l'ideologia principale dei servizi RESTful.
Può essere fatto? A livello tecnico, se lo vuoi davvero, certo. Ma questo è un caso del problema XY . La soluzione proposta (Y - la memorizzazione nella cache dei dati) è una soluzione alternativa al problema reale (X - impaginando la query per ridurre la quantità di dati restituiti).
La memorizzazione dell'intero set di dati risolve solo la metà del problema. Se l'utente guarda mediamente solo due pagine significa che hai recuperato 20 righe utili e 9980 righe inutili (supponendo 10.000 righe in totale). Ciò significa che 99,8% dei dati recuperati non viene mai utilizzato. Questo è ancora un grande spreco di spazio.
Inoltre, dovresti memorizzare nella cache un set di dati separato per ogni combinazione univoca di filtri. Il che significa che probabilmente avrai una tonnellata di dati duplicati in memoria, perché un determinato record potrebbe apparire in diversi set di dati filtrati in modo diverso.
Supponendo che tu abbia una quantità significativa di utenti concorrenti e memorizzi tutte le loro richieste nella cache, sto iniziando a pensare che sarebbe più efficiente memorizzare semplicemente l'intera tabella in memoria una volta, solo per eliminare i duplicati ( Non sto dicendo che dovresti fare questo , sto solo sottolineando che il caching di tutto causerà più problemi di quanti ne possa risolvere).
Ci sono molte ragioni per cui non dovresti cercare di memorizzare nella cache i dati non impaginati come soluzione per un problema di impaginazione.
I know I could modify the query that Dapper uses so the pagination filter goes down to the query level, but I find that's too much burden to do
Bene, se rifiuti di impaginare il set di dati, ovviamente non puoi aspettarti un set di dati impaginato. Ma poi stai escludendo la soluzione corretta a favore di una soluzione unRESTful più semplice; che probabilmente creerà debito tecnico per il futuro.
Dai un'occhiata a questa impaginazione con l'esempio di Dapper Dovrai cambiare la sottoquery a tua scelta query.
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY InsertDate) AS RowNum, *
FROM Posts
WHERE InsertDate >= '1900-01-01'
) AS result
WHERE RowNum >= 1 // *your pagination parameters
AND RowNum =< 10 //*
ORDER BY RowNum
Tutto ciò che devi fare per implementare questo per te è calcolare i limiti di riga ( 1
e 10
nell'esempio). Questi possono essere trovati usando semplici calcoli.
Nota: presumo che pageNumber
sia 1-indexed, perché in genere è come l'interpreta l'interfaccia utente. pageSize
è 10 nel tuo caso.
var row_limit_lower = ((pageNumber - 1) * pageSize) + 1;
var row_limit_upper = (pageNumber * pageSize) - 1;
Scopri quale numero di pagina è stato richiesto. Sulla base di questo (e una dimensione della pagina, che deduco è sempre 10 per la tua applicazione), puoi calcolare e implementare l'impaginazione necessaria nella query stessa, impedendo così il recupero di molte righe inutili.