如果不使用分頁查詢,NHibernate可以通過映射中的提示在單個數據庫命中中加載整個對象和相關對象。但是,如果您正在使用分頁,它會創建大量的數據庫調用。如何在對象圖上改善對分頁查詢的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)?
我曾嘗試通過加載所需要的發票ID列表到一個查詢,然後使用
_invoiceQuery.Where(x => requiredIds.Contains(x.Id));
但似乎NHibernate的降低包含約束到SQL時有同樣的問題,手動強制問題。
...或者我必須接受我需要使用不同的工具嗎?
我真的不能接受這個答案,因爲「你應該能夠擊中數據庫兩次,並在代碼後面結婚父/子實體「。誤解了我的問題的最後一點:NHibernate翻譯'_invoiceQuery.Where(x => requiredIds.Contains(x.Id));'到100個單獨的數據庫命中。 – perfectionist 2014-11-28 10:00:50