Путаница в универсальном методе подкачки Linq к SQL

#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.