În aplicația mobilă, am încercat pentru a prelua date dintr-un tabel al meu bază de date SQL Server. Eu sunt, folosind EF și încerc să folosesc paginare pentru o performanță mai bună. Am nevoie pentru a prelua date de la ultimul element din tabel. deci, dacă tabelul are 20 de rânduri, am nevoie, pentru pagina 0, Id-uri de 20, 19, 18, 17, 16, apoi de pagina 1, Id-uri de 15, 14, 13, 12, 11 și așa mai departe...
Problema este următoarea: ce se întâmplă dacă, în timp ce utilizatorul "A" este descărcarea datelor din tabel, utilizatorul "B" adăugați rând? Dacă utilizatorul "A" obține Pagina 0 (deci Id-uri 20, 19, 18, 17, 16), și utilizatorul "B" în același moment se adaugă rând (așa ID 21), cu clasice de interogare, utilizatorul "a" de la pagina 1 va primi Id-uri 16, 15, 14, 13, 12... deci, un alt timp de IDENTITATE 16
Codul meu este foarte simplu:
int RecordsForPagination = 5;
var list = _context.NameTable
.Where(my_condition)
.OrderByDescending(my_condition_for ordering)
.Skip (RecordsForPagination * Page)
.Take (RecordsForPagination)
.ToList();
Desigur Page
este int care vin din partea de frontend.
Cum pot rezolva problema?
Am găsit o soluție, dar nu știu dacă e unul perfect. Am putea folosi
.SkipWhile(x => x.ID >= LastID)
în loc
.Skip (RecordsForPagination * Page)
și, desigur, LastID
întotdeauna este trimis de frontend.
Crezi că performanța este întotdeauna bun cu acest cod? Există o soluție mai bună?