2008-12-02 54 views
5

我有一个多对一的关系,其中子表可以包含数十万条记录。在这种情况下,调用Parent.ChildCollection.Count强制进行子集合的延迟初始化,这非常昂贵。使用NHibernate 2.0.1实现类似于lazy =“extra”的功能的最佳方法

在Hibernate 3.0中有一个特性lazy =“extra”,它允许你检查集合属性的一个子集而不需要延迟加载整个事物。

不幸的是,这将不会提供,直到NHibernate 2.1,仍然在阿尔法。 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 "/> 

,而是因为我现在分享这个库及其对其他用户的性能问题,我不能再使用这些。

+1

升级到NHibernate 3并关闭此问题? – 2010-12-16 17:59:24

回答

0

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

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

0

很晚了,但你仍然可以在集合

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

这不会强制征收的初始化,而是执行一个查询到数据库

0

我会建议一个单独的应用过滤器查询,而不是域关系。然后你可以使用各种优化。

相关问题