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