我有一个使用nHibernate从数据库中检索实体的方法。这是一个相当复杂的实体:
Level4有很多Level3,有很多Level2,有很多Level1,有Level1Ref
所以我使用了一些像这样的未来:
var future = this.Session.QueryOver<Level4>()
.Where(x => x.Id == level4Id)
.Fetch(x => x.Level3List).Eager
.Fetch(x => x.Level3List.First().Level2List).Eager
.Left.JoinAlias(x => x.Level3List, () => level3Alias, x => x.AnotherThing.Id == anotherThingId)
.FutureValue();
有些问题是这样的:
this.Session.QueryOver<Level1>()
.Fetch(x => x).Eager
.Fetch(x => x.Level1Ref).Eager
.Fetch(x => x.Level2).Eager
.Inner.JoinAlias(x => x.Level2, () => level2Alias)
.Inner.JoinAlias(() => level2Alias.Level3, () => level3Alias, x => x.AnotherThing.Id == anotherThingId && level3Alias.Level4.Id == level4Id)
.Future();
然后:
var record = future.Value;
这都会生成我期望的SQL,但是当我尝试迭代Level2.Level1List时,它会延迟加载该列表中的记录。
问题:
这就是问题所在。我有什么?在我的查询中做错了nHibernate认为它需要到数据库获取它已经获得的信息? (我有一种预感,我需要将一些JoinQueryOver位换成热切的提取物吗?
(为简化示例而编辑的问题)
答案 0 :(得分:1)
经过大量的调查后,我能够完成这项工作的唯一方法是更改所有查询,以便他们拥有相同的TRoot。 IE浏览器。改变他们所以他们都这样开始:
this.Session.QueryOver<Level4>()
在这种情况下,这显然不是理想的:
鱼贩
鱼的收集
眼睛的集合 骨的收集
这意味着我必须写两个查询并加入Fish两次......
另一种方法是延迟加载和批处理查询,但要求是只对数据库进行一次往返。