Dans mon application mobile, j'essaie de récupérer des données à partir d'une table de ma base de données SQL Server. Je suis à l'aide d'EF et j'essaie d'utiliser la pagination pour de meilleures performances. J'ai besoin de récupérer des données à partir du dernier élément de la table. donc, si la table dispose de 20 lignes, j'ai besoin, pour la page 0, Id 20, 19, 18, 17, 16, puis pour la page 1 Id 15, 14, 13, 12, 11 et ainsi de suite...
Le problème est: est-ce que si, alors que l'utilisateur "A" est en cours de téléchargement des données du tableau, l'utilisateur "B" ajouter une ligne? Si l'utilisateur "Une" de la Page 0 (donc les Id 20, 19, 18, 17, 16), et l'utilisateur "B" dans le même moment ajouter une ligne (donc ID 21), avec les classiques de la requête, l'utilisateur "A" pour la page 1 obtiendrez Id 16, 15, 14, 13, 12... donc, une autre fois, ID 16
Mon code est très simple:
int RecordsForPagination = 5;
var list = _context.NameTable
.Where(my_condition)
.OrderByDescending(my_condition_for ordering)
.Skip (RecordsForPagination * Page)
.Take (RecordsForPagination)
.ToList();
Bien sûr Page
est de type int qui viennent de l'interface.
Comment puis-je résoudre le problème?
J'ai trouvé une solution mais je ne sais pas si c'est le parfait. Je pourrais utiliser
.SkipWhile(x => x.ID >= LastID)
au lieu de cela
.Skip (RecordsForPagination * Page)
et bien sûr LastID
toujours est envoyé à partir du frontend.
Pensez-vous que la performance est toujours bon avec ce code? Est-il une meilleure solution?