#linq-to-sql #paging
#linq-to-sql #подкачка
Вопрос:
Если я убегу
ctx.CompanyDirectors.OrderBy(c => c.Id).Skip(pageNumber*pageSize).Take(pageSize).ToList();
Подкачка происходит на SQL Server (теперь уже классическом row_number() OVER
), и это то, чего я и ожидал.
Однако я добавил небольшой метод расширения ярлыка ниже:
public static IEnumerable<T> Page<T>(this IEnumerable<T> enumerable, int pageNumber, int pageSize)
{
return enumerable
.Skip(pageNumber*pageSize)
.Take(pageSize);
}
И когда я делаю
ctx.CompanyDirectors.OrderBy(c => c.Id).Page(pageNumber, pageSize).ToList();
Подкачка теперь происходит обратно в клиентском коде, т. е. возвращаются все результаты, и подкачка происходит в памяти, что ненадежно.
Я озадачен, но явно упускаю из виду что-то вопиюще очевидное…
Ответ №1:
Я думаю, вам нужно включить метод расширения IQueryable<T>
.
Комментарии:
1. Да, IQueryable должен быть доступен для синтаксического анализа в SQL. IEnumerable приведет к подкачке страниц в памяти с использованием L2O.