#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)
запрос