NHibernate может загружать весь объект и связанные объекты в одном ударе db через подсказки в сопоставлении, если вы не используете разбитый на страницы запрос. Тем не менее, если вы используете пейджинг, он делает большое количество вызовов db.Как улучшить производительность Nhibernate при разбиении на страницы запросов по графу объектов
Например, у меня есть объект Invoice
и объект InvoiceLine
, так что у счета есть List
строк фактуры. Плавное отображение Счет-фактура является
HasMany(x => x.Lines)
.Table("InvoiceLine")
.KeyColumn("InvoiceId")
.Fetch.Join()
.Not.LazyLoad();
Опция Not.LazyLoad отлично работает, чтобы загрузить весь граф объектов в одной БД попаданием при загрузке одного счета ... но если я хочу, чтобы запустить постраничного запрос типа
_invoiceQuery.Skip(200).Take(100);
Тогда NHibernate сначала загружает все 100 счетов-фактур в один удар ... и затем попадает в базу данных более 100 раз за счет-фактура линий каждого счета-фактуры по одному за раз.
Есть ли способ, чтобы уменьшить это до 2 хитов, то есть
- Загрузки счета-фактуры
- нагрузок ВСЕХ InvoiceLines для счетов-фактур в (1)?
Я попытался вручную заставить проблему путем загрузки списка необходимых идентификаторов счетов в запрос, а затем с помощью
_invoiceQuery.Where(x => requiredIds.Contains(x.Id));
но мне кажется, NHibernate имеет те же проблемы при уменьшении Содержит ограничение в SQL ,
... или я должен признать, что мне нужно использовать другой инструмент?
Я не могу принять этот ответ, потому что «вы должны дважды ударить по базе данных и выйти замуж за родительские/дочерние сущности в коде «. неверно понимает последний вопрос в моем вопросе: NHibernate переводит '_invoiceQuery.Where (x => requiredIds.Contains (x.Id));' 100 раздельных удалений БД. – perfectionist