W swojej aplikacji mobilnej staram się usuwać dane z tabeli bazy danych programu SQL Server. Używam EF i staram się stosować podział na strony do zwiększenia wydajności. Muszę wyciągnąć dane z ostatniej pozycji w tabeli. dlatego, jeśli w tabeli 20 wierszy, potrzebuję do strony 0 identyfikatory 20, 19, 18, 17, 16, następnie do strony 1 identyfikatory 15, 14, 13, 12, 11 i tak dalej...
Problem w tym, że: a co, jeśli, dopóki użytkownik "A" pobiera dane z tabeli użytkownik "B" dodaje się wiersz? Jeśli użytkownik A otrzyma stronę 0 (tak, że identyfikatory 20, 19, 18, 17, 16), użytkownik "B" w tym samym momencie doda wiersz (tak, że identyfikator 21), za pomocą klasycznego zapytania użytkownik "A" do strony 1 otrzymuje identyfikatory 16, 15, 14, 13, 12... więc innym razem ID 16
Mój kod jest bardzo prosty:
int RecordsForPagination = 5;
var list = _context.NameTable
.Where(my_condition)
.OrderByDescending(my_condition_for ordering)
.Skip (RecordsForPagination * Page)
.Take (RecordsForPagination)
.ToList();
Oczywiście Page
to int, które pochodzą z interfejsu.
Jak mogę rozwiązać ten problem?
Znalazłem rozwiązanie, ale nie wiem, czy jest ono idealne. Mógłbym użyć
.SkipWhile(x => x.ID >= LastID)
zamiast
.Skip (RecordsForPagination * Page)
i oczywiście LastID
zawsze wywoływane z interfejsu.
Jak myślicie, czy zawsze z tym kodem dobra wydajność? Czy jest lepsze rozwiązanie?