0

我需要(出于一个真正充分的理由,相信我)使用 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 似乎不可能。

4

1 回答 1

1

简短回答:Fetch()/FetchMany() 和 Future() 的组合,具体取决于用例和预期的列表大小

于 2012-01-30T09:01:50.327 回答