LINQ to SQL делает это с помощью оконной функции 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;
Это работает, но необходимость получения row_number из ORDER BY может привести к сортировке вашего запроса на стороне сервера и вызвать проблемы с производительностью. Даже если индекс может удовлетворить требование ORDER BY, запрос все равно должен посчитать 1000 строк, прежде чем начать возвращать результаты. Слишком часто разработчики забывают об этом и просто запускают элемент управления разбиением на страницы над таблицей 5 миллионов строк и задаются вопросом, почему первая страница возвращается намного быстрее, чем последняя ...
Тем не менее использование ROW_NUMBER (), вероятно, является наилучшим балансом между простотой использования и хорошей производительностью при условии, что вы избегаете сортировки (условие ORDER BY может быть удовлетворено индексом).