LINQ to SQL le fait en utilisant une fonction de fenêtrage 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;
Cela fonctionne, mais la nécessité de fabriquer le row_number à partir de ORDER BY peut entraîner le tri de votre requête côté serveur et entraîner des problèmes de performances. Même lorsqu'un index peut satisfaire l'exigence ORDER BY, la requête doit toujours compter 1 000 lignes avant de commencer à renvoyer des résultats. Trop souvent, les développeurs oublient cela et lancent simplement un contrôle de pagination sur une table de 5 millions de lignes et se demandent pourquoi la première page est renvoyée beaucoup plus rapidement que la dernière ...
Néanmoins, l'utilisation de ROW_NUMBER () est probablement le meilleur équilibre entre facilité d'utilisation et bonnes performances, à condition d'éviter le tri (la condition ORDER BY peut être satisfaite par un index).