我有一对多的关系,其中子表可以有数十万条记录。在这种情况下,调用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 "/>
但我不能再使用这些了,因为我现在正在共享这个库,并且对其他用户来说是一个性能问题。
答案 0 :(得分:0)
当你说其他用户的性能问题时,你的意思是他们也想访问该集合,但它对他们来说太大了。或者代码片段/ ChildCollectionCount对他们来说太慢了?
如果是第一种情况,那么也许你需要为它们做一个类似的解决方案 - 确切地确定它们需要什么,并提供提供该设施的方法。
答案 1 :(得分:0)
很晚,但您可以对集合应用过滤器
IQuery q = nhSession.CreateFilter(Parent.ChildCollection, "select count(*)");
long countResult = q.UniqueResult<long>();
这不会强制初始化集合,而是对db
执行单个查询答案 2 :(得分:0)
我建议使用单独的查询,而不是域关系。然后你可以使用各种优化。