LINQ to SQL robi to za pomocą funkcji okienkowej ROW_NUMBER:
SELECT a,b,c FROM
(SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number
FROM Table) t0
WHERE to.row_number BETWEEN 1000 and 1100;
To działa, ale potrzeba wytworzenia row_number z ORDER BY może skutkować posortowaniem zapytania po stronie serwera i spowodować problemy z wydajnością. Nawet jeśli indeks może spełnić wymaganie ORDER BY, zapytanie nadal musi policzyć 1000 wierszy, zanim zacznie zwracać wyniki. Zbyt często programiści o tym zapominają i po prostu wrzucają kontrolę paginacji do tabeli 5 milionów wierszy i zastanawiają się, dlaczego pierwsza strona jest zwracana o wiele szybciej niż ostatnia ...
Niemniej jednak, użycie ROW_NUMBER () jest prawdopodobnie najlepszą równowagą między łatwością użycia a dobrą wydajnością, pod warunkiem, że unikasz sortowania (warunek ORDER BY można spełnić za pomocą indeksu).