Немного поздно, но ...
Repository.Find()
возвращает IList, поэтому запрос выполняется, следовательно, SQL выполняется без подкачки, тогда
.Skip(x).Take(x)
делается в памяти.
Попробуйте
Repository.All().Where(expression).Skip(x).Take(x)
все из которых возвращают IQueryable, а не перечисляют объекты, поэтому подкачка страниц выполняется в SQL с использованием функции ROW_NUMBER ().
Сказав, что Subsonic 3 простой репозиторий генерирует следующий SQL
exec sp_executesql N'SELECT [t0].[Id], [t0].[IsDeleted], [t0].[Name], [t0].[ParentUuid], [t0].[Uuid]
FROM ( SELECT [t1].[Id], [t1].[IsDeleted], [t1].[Name], [t1].[ParentUuid], ROW_NUMBER() OVER() AS rownum, [t1].[Uuid]
FROM [Sites] AS t1
WHERE (([t1].[ParentUuid] = @p0) AND ([t1].[IsDeleted] = 0))) AS t0
WHERE [t0].[rownum] BETWEEN (20 + 1) AND (20 + 10)',N'@p0 uniqueidentifier',@p0='00000000-0000-0000-0000-000000000000'
который выдает исключение
Unhandled Exception: System.Data.SqlClient.SqlException: The ranking function "ROW_NUMBER" must have an ORDER BY clause.
так что может показаться, что в Subsonic есть ошибка: - (