我需要(出于一个很好的理由,相信我)使用NHibernate加载我的数据库的几乎整个图表。没有那么多实体,但是这个图有点复杂。
我的图表看起来像是:
好吧..。你明白了吧。
我希望用尽可能少的查询和往返来加载所有这些信息,而且可能根本没有选择的N+1。另外,我想把它保持为一个图,这样以后我就可以很容易地遍历它。
我最好的选择是什么?NHibernateUtil.Initialize()?获取()/FetchMany()?未来/多重查询?
我有点迷路了,但我想我得做多个手术了。但是什么才是最有效的呢?
还有:所有实体都有一个IsPublished属性。我希望能够加载所有实体或仅那些已发布的实体。
编辑
最后,我尝试了这个:
var applicationFields = NHibernateSession.Current.Query<ApplicationField>().Where(af => af.Ispublished)
.FetchMany(af => af.Illustrations)
.ThenFetch(i => i.InteractiveConfiguration)
.ThenFetchMany(ic => ic.UniqueSellingPoints)
.ThenFetchMany(usp => usp.Pictures)
.ToList();考虑到我的图表的样子,我认为它是很好的。而且,我没有同一水平的多个集合,据我所知,这就是导致笛卡儿产品的原因。
对于那些提出要求的人来说,这不是一个递归问题。否则,我将使用Server。另外,我没有更新任何实体,它只是普通阅读(用于脱机应用程序)。
但我对我的“奖金”问题一无所知。我知道EF可以基于过滤器加载部分集合,但是使用NH似乎是不可能的。
发布于 2012-01-30 09:01:50
简短的回答:根据usecase和预期的列表大小,Fetch()、/FetchMany()和Future()的组合
https://stackoverflow.com/questions/9037589
复制相似问题