NHibernate:加载整个图形(集合集合)

时间:2012-01-27 17:39:07

标签: sql-server nhibernate graph future multi-query

我需要(出于一个很好的理由,相信我)使用NHibernate加载几乎整个数据库的图形。没有那么多实体,但图表有点复杂。

我的图表看起来像:

  • EntityA
  • |
  • - > EntityB
  • |
  • - >名单
    • |
    • - > EntityD
    • |
    • - >名单
      • |
      • - > EntityF

嗯......你明白了。

我想用尽可能少的查询和往返加载所有这些,并且可能根本没有选择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似乎不可能。

1 个答案:

答案 0 :(得分:1)

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