2010-09-09 49 views
1

我需要帮助从取树层次数据库使用NHibernate 3.0NHibernate的取整棵树

QueryOver.Of<Enterprise>(() => entAlias) 
    .JoinAlias(() => entAlias.ChildEntities,() => childEntityAllias, JoinType.LeftOuterJoin) 
    .TransformUsing(new DistinctRootEntityResultTransformer()) 

我只获得两个层的图表(母公司及其子女),但没有子女等

的儿童

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

Ho做这种类型的查询。没有mather如果Icriteria,LINQ,HQL或其他。

+0

你能展示你的类和映射文件吗?您的树层次结构在每个级别上是不同的类型,还是ChildEntities也是Enterprise对象? – 2010-12-01 20:51:52

回答

1

您可以使用批量大小更有效地获取孩子。

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

孩子仍然由单独的查询加载(你不应该在查询中加入他们了),但始终保持在20一次。将“N + 1”变成通常表现非常好的“N/20 + 1”。这个解决方案的优点是你不需要关心你的查询。

您也可以加载在批父母:

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

它加载多到一个关系到企业分批如果可能的话。

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

+0

谢谢,我认为这是现在最好的答案。唯一的问题是我正在使用遗留数据库,它使用Identity作为主键,因此批处理被禁用,无法使用。 – Luka 2010-12-06 09:17:01

+0

这是批量提取(不是批量插入和更新)。它应该总是可能的,它不依赖于使用的id生成器的种类。 – 2010-12-06 10:06:42

0

如果你真的想要获取所有东西(尽管我不确定你为什么要这样做),那么在NHibernate中禁用延迟加载(从而启用加载)。