在Category.ChildCategories
映射中指定batch-size
。這將導致NHibernate以指定大小的批次獲取子項,而不是一次一個(這將緩解N + 1問題)。
如果您正在使用.hbm
文件,你可以指定batch-size
這樣的:
<bag name="ChildCategories" batch-size="30">
或使用流利的映射
HasMany(x => x.ChildCategories).KeyColumn("ParentId").BatchSize(30);
更多信息,請參見NHibernate documentation。
編輯
好吧,我相信我理解您的需求。使用以下配置
HasManyToMany<Item>(x => x.ChildCategories)
.Table("CategoryLink")
.ParentKeyColumn("ParentId")
.ChildKeyColumn("CategoryID")
.BatchSize(100)
.Not.LazyLoad()
.Fetch.Join();
您應該能夠使用以下行在一次調用中獲取整個層次結構。
var result = session.CreateCriteria(typeof(Category)).List();
出於某種原因,檢索單一品類這樣
var categoryId = 1;
var result = session.Get<Category>(categoryId);
導致在層次結構每級一個呼叫。我相信這應該仍然會大大減少對數據庫的調用次數,但是我無法獲得上面的示例來使用對數據庫的單個調用。
我已經使用批量大小。然而,這隻能解決一個層面,而不是'n'層面。樹可以深深地說3,4或甚至更多的層次。理想情況下,我正在查看整個級別的1個查詢。 –
批量大小不會完全產生有效的查詢計劃。它產生大量的單身查詢。雖然可以在性能和工程時間之間取得很好的平衡。 – usr