Привязанный FetchMany в Linq к NHibernate

#nhibernate #linq-to-nhibernate #fetch #eager-loading #nhibernate-3

#nhibernate #linq-to-nhibernate #извлечение #нетерпеливая загрузка #nhibernate-3

Вопрос:

Я использую FetchMany для некоторых своих запросов, и профилировщик NHibernate выдает мне следующую ошибку:

ПРЕДУПРЕЖДЕНИЕ:
firstResult / maxResults, указанные с помощью выборки коллекции; применяется в памяти!

Я думаю, это потому, что выборка не привязана. Есть ли решение для этого?

Ответ №1:

Эта проблема возникает из-за того, что использование FetchMany перенесет весь результирующий набор в память, а затем возьмет указанное подмножество (что неэффективно и потенциально опасно).

По-видимому, нет способа ограничить подмножество перед выборкой при использовании FetchMany .

Решение состоит в том, чтобы использовать либо JoinQueryOver , либо a JoinAlias (различия между ними обсуждались в других вопросах SO)

Поэтому вместо того, чтобы делать

 Session.QueryOver<Product>().FetchMany(p=>p.Images).Take(5)
  

который выдает предупреждение в вопросе, мы делаем

 Image image = null;
Session.QueryOver<Product>().Left.JoinQueryOver(x => x.Images, () => image).Take(5)
  

который выдает SELECT TOP (5) запрос