2011-08-23 70 views
0

:)NHibernate的集合的大小,而无需加载整个集合

我有以下类别:

    • DislikedComment (评论)
    • 成员Id (INT)
  • 评论
    • 不喜欢(名单<踩>)
    • 文本(字符串)
    • 条款ArticleID (INT)

(超为简洁起见,省略了属性)

这些类以预期的方式使用Fluent NHibernate进行映射(在注释列表上反向)。现在我想让NHibernate在加载评论时加载不喜欢集合的大小,但不加载整个集合。我非常想避免使用公式(yuk @ native sql),我宁愿让NHibernate只激发一个查询。这是可能的吗?

我知道Extra Lazy功能,但据我所知,这会激发额外的查询,这对于数百个评论列表来说并不是最佳的。

+0

只是为了确认你要求计算孩子(不喜欢)而不必加载整个图表? – Rippo

+0

@Rippo,是的,我只需要Dislike count。 – ManiSto

+0

在这种情况下,lazy =“extra”对你来说是完美的搭配。 – Rippo

回答

1

这是一个常见的错误,你需要1个查询最佳性能。

每次连接都要求数据库执行额外的工作,并且查询的复杂性和成本随着每次额外连接而快速增长。虽然关系数据库针对处理连接进行了优化,但执行多个单独的查询而不是单个查询(其中包含多个连接)往往更有效。

在你的情况下,我会做2个查询。

var dislikeCount = _session.Query<Comment>().Count(x=>x.Dislike); 
var comments = _session.Query<Comment>().ToList(); 

ps:别忘了把它包装在一个事务中。

+0

是的。但是,一如既往,在决定哪个更快之前进行配置。 _Premature_优化通常是不值得的。 –

+0

除非您在映射中添加lazy ='extra',否则您将执行select *而不是'select count(*)' – Rippo