使用NHibernate 2.0.1实现类似于lazy =“extra”的功能的最佳方法

时间:2008-12-02 21:52:19

标签: nhibernate

我有一对多的关系,其中子表可以有数十万条记录。在这种情况下,调用Parent.ChildCollection.Count强制延迟初始化子集合,这非常昂贵。

在Hibernate 3.0中有一个lazy =“extra”功能,它允许你检查集合属性的子集,而不会延迟加载整个东西。

不幸的是,直到NHibernate 2.1仍处于Alpha状态时才会出现这种情况。 http://jira.nhibernate.org/browse/NH-855

如何使用NHibernate 2.0.1实现这一目标?

我曾经有过这样的特殊属性

<property name="ChildCollectionCount" type="int" formula="(select count(*) from ChildTable child where child.parentID = parentID "/>

但我不能再使用这些了,因为我现在正在共享这个库,并且对其他用户来说是一个性能问题。

3 个答案:

答案 0 :(得分:0)

当你说其他用户的性能问题时,你的意思是他们也想访问该集合,但它对他们来说太大了。或者代码片段/ ChildCollectionCount对他们来说太慢了?

如果是第一种情况,那么也许你需要为它们做一个类似的解决方案 - 确切地确定它们需要什么,并提供提供该设施的方法。

答案 1 :(得分:0)

很晚,但您可以对集合应用过滤器

IQuery q = nhSession.CreateFilter(Parent.ChildCollection, "select count(*)");
long countResult = q.UniqueResult<long>();

这不会强制初始化集合,而是对db

执行单个查询

答案 2 :(得分:0)

我建议使用单独的查询,而不是域关系。然后你可以使用各种优化。