Nella mia app mobile, cerco di recuperare i dati da una tabella del mio database di SQL Server. Sto usando EF e cerco di usare la paginazione per migliorare le prestazioni. Ho bisogno di recuperare i dati dall'ultimo elemento della tabella. quindi se la tabella ha 20 righe, ho bisogno, per pagina 0, Id 20, 19, 18, 17, 16, quindi per pagina 1 Id 15, 14, 13, 12, 11 e così via...
Il problema è questo: cosa succede se, mentre l'utente "A" sta scaricando i dati dalla tabella, l'utente "B" aggiungi riga? Se l'utente "A" get Pagina 0 (quindi Id 20, 19, 18, 17, 16), e l'utente "B" nello stesso momento, aggiungi riga (quindi ID 21), con il classico query, l'utente "A" pagina 1 otterrà Id 16, 15, 14, 13, 12... così un'altra volta ID 16
Il mio codice è molto semplice:
int RecordsForPagination = 5;
var list = _context.NameTable
.Where(my_condition)
.OrderByDescending(my_condition_for ordering)
.Skip (RecordsForPagination * Page)
.Take (RecordsForPagination)
.ToList();
Naturalmente Page
è di tipo int che provengono dal frontend.
Come posso risolvere il problema?
Ho trovato una soluzione ma non so se è il perfetto. Potrei usare
.SkipWhile(x => x.ID >= LastID)
invece
.Skip (RecordsForPagination * Page)
e, naturalmente, LastID
sempre viene inviato dal frontend.
Pensi che le prestazioni sempre bene con questo codice? C'è una soluzione migliore?