我需要(出于一个真正充分的理由,相信我)使用 NHibernate 加载我的数据库的几乎整个图表。实体不多,但图表有点复杂。
我的图表看起来像:
- 实体A
- |
- --> 实体B
- |
- --> 列表
- |
- --> 实体D
- |
- --> 列表
- |
- --> 实体F
反正你懂这个意思。
我想用尽可能少的查询和往返来加载所有这些,并且可能根本没有选择 N+1。此外,我想将其保留为图表,以便以后可以轻松地循环浏览它。
我最好的选择是什么?NHibernateUtil.Initialize()?Fetch()/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();
考虑到我的图表的外观,我认为这还不错。此外,我在同一级别上没有多个集合,据我所知,这就是导致笛卡尔积的原因。
对于那些询问的人,这不是递归问题。否则我将使用 SQL Server CTE。我也没有更新任何实体;它只是简单的阅读(对于离线应用程序)。
但我对我的“奖金”问题一无所知。我知道 EF 可以根据过滤器加载部分集合,但 NH 似乎不可能。