LINQ to SQL hace esto usando una función de ventana 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;
Esto funciona, pero la necesidad de fabricar el número de fila a partir de ORDER BY puede hacer que su consulta se ordene en el lado del servidor y cause problemas de rendimiento. Incluso cuando un índice puede satisfacer el requisito ORDER BY, la consulta aún debe contar 1000 filas antes de comenzar a devolver resultados. Con demasiada frecuencia, los desarrolladores olvidan esto y simplemente lanzan un control de paginación sobre una tabla de filas de 5 mil y se preguntan por qué la primera página se devuelve mucho más rápido que la última ...
No obstante, usar ROW_NUMBER () es probablemente el mejor equilibrio entre facilidad de uso y buen rendimiento, siempre que se asegure de evitar la ordenación (la condición ORDER BY puede satisfacerse mediante un índice).