В своем мобильном приложении я пытаюсь извлечь данные из таблицы базы данных SQL Server. Я использую EF и стараюсь использовать разбиение на страницы для повышения производительности. Мне нужно извлечь данные из последнего элемента таблицы. поэтому, если в таблице 20 строк, мне нужны для страницы 0 идентификаторы 20, 19, 18, 17, 16, затем для страницы 1 идентификаторы 15, 14, 13, 12, 11 и так далее...
Проблема в следующем: что, если, пока пользователь "А" загружает данные из таблицы, пользователь "Б" добавляет строку? Если пользователь "А" получит страницу 0 (так что идентификаторы 20, 19, 18, 17, 16), и пользователь "B" в тот же момент добавит строку (так что идентификатор 21), с помощью классического запроса пользователь "A" для страницы 1 получит идентификаторы 16, 15, 14, 13, 12... так что в другой раз ID 16
Мой код очень прост:
int RecordsForPagination = 5;
var list = _context.NameTable
.Where(my_condition)
.OrderByDescending(my_condition_for ordering)
.Skip (RecordsForPagination * Page)
.Take (RecordsForPagination)
.ToList();
Конечно Page
это int, которые поступают с интерфейса.
Как я могу решить эту проблему?
Я нашел решение, но не знаю, является ли оно идеальным. Я мог бы использовать
.SkipWhile(x => x.ID >= LastID)
вместо
.Skip (RecordsForPagination * Page)
и конечно же LastID
всегда отправляется с интерфейса.
Как вы думаете, всегда ли с этим кодом хорошая производительность? Есть ли лучшее решение?