nhibernate取整棵树

时间:2010-09-09 18:48:17

标签: nhibernate tree

我需要帮助从db使用nhibernate 3.0

获取树层次结构
 QueryOver.Of<Enterprise>(() => entAlias)
     .JoinAlias(() => entAlias.ChildEntities, () => childEntityAllias, JoinType.LeftOuterJoin)
     .TransformUsing(new DistinctRootEntityResultTransformer())

我只获得图表的两个级别(父级及其子级),但不是儿童的孩子等。

同样的,如果我试图取叶子的父母。我只得到叶子的父,但不是叶子的父亲的父亲的父亲。其中level = n。

何要做这种类型的查询。如果Icriteria,linq,HQL或其它,那就没有了。

2 个答案:

答案 0 :(得分:1)

您可以使用batch-size更有效地获取子项。

<bag name="Childen" batch-size="20" ...>

子项仍然由单独的查询加载(您不应再将它们加入查询中),但始终是20。将“N + 1”变为“N / 20 + 1”,这通常表现非常好。此解决方案的优点是您无需关心查询。

您还可以批量加载父母:

<class name="Enterprise" batch-size="20">

如果可能的话,它会批量加载与企业的多对一关系。

如果您需要更多优化,请考虑添加对根的引用(最顶层的父级)。然后,您可以在一个简单的查询中加载根的所有子项。缺点是你需要关心这个参考,它是一种冗余,也很难维护。

答案 1 :(得分:0)

如果你真的想要获取所有内容(虽然我不确定你为什么要做这样的事情)然后在NHibernate中禁用延迟加载(从而启用急切加载)。