我需要(出于一个很好的理由,相信我)使用NHibernate加载几乎整个数据库的图形。没有那么多实体,但图表有点复杂。
我的图表看起来像:
嗯......你明白了。
我想用尽可能少的查询和往返加载所有这些,并且可能根本没有选择N + 1。另外我想把它保存为图形,所以我可以在以后轻松地循环它。
我最好的选择是什么? NHibernateUtil.Initialize()?取()/支持fetchmany()?未来/ MultiQuery?
我有点失落,但我想我必须在多个操作中做到这一点。但最有效的是什么?
奖励:所有实体都有一个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();
考虑到我的图表的外观,我认为这很好。另外,我在同一级别没有多个集合,据我所知,这就是诱导笛卡尔积的原因。
对于那些问过的人来说,这不是一个递归问题。否则我将使用SQL Server CTE。我也没有更新任何实体;它只是简单阅读(对于离线应用程序)。
但我对“奖金”问题毫无头绪。我知道EF可以根据过滤器加载部分集合,但NH似乎不可能。
答案 0 :(得分:1)
简短回答:Fetch()/ FetchOne()和Future()的组合,具体取决于用例和预期的列表大小