实现类似lazy的功能的最佳方法=";额外的;使用NHibernate 2.0.1

实现类似lazy的功能的最佳方法=";额外的;使用NHibernate 2.0.1,nhibernate,Nhibernate,我有一个多对一关系,其中子表可以有数十万条记录。在这种情况下,调用Parent.ChildCollection.Count会强制延迟初始化子集合,这非常昂贵 在Hibernate 3.0中,有一个lazy=“extra”特性,允许您检查集合属性的子集,而无需延迟加载整个集合 不幸的是,在NHibernate2.1之前,这项功能将不可用,而NHibernate2.1仍处于Alpha版本。 如何使用NHibernate 2.0.1实现这一点 我以前有像这样的特殊属性 <property na

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

在Hibernate 3.0中,有一个lazy=“extra”特性,允许您检查集合属性的子集,而无需延迟加载整个集合

不幸的是,在NHibernate2.1之前,这项功能将不可用,而NHibernate2.1仍处于Alpha版本。

如何使用NHibernate 2.0.1实现这一点

我以前有像这样的特殊属性

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


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

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


如果是第一种情况,那么您可能需要为他们提供类似的解决方案—准确地确定他们需要什么,并提供提供该功能的方法。

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

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

这不会强制初始化集合,而是对db执行单个查询。我建议使用单独的查询,而不是域关系。然后您可以使用各种优化。

升级到NHibernate 3并关闭此问题?