【问题标题】:NHibernate collection size without loading the entire collectionNHibernate 集合大小而不加载整个集合
【发布时间】:2025-12-31 13:25:06
【问题描述】:

:)

我有以下课程:

  • 不喜欢
    • 不喜欢的评论(评论)
    • MemberId (int)
  • 评论
    • 不喜欢 (List)
    • 文本(字符串)
    • ArticleId (int)

(为简洁起见省略了额外的属性)

这些类是使用 Fluent NHibernate 以预期的方式映射的(在注释列表中具有逆向)。现在我希望 NHibernate 在加载评论时在评论上加载 Dislikes 集合的大小,但不加载整个集合。我非常想避免使用公式(yuk @ native sql),我更希望 NHibernate 只触发一个查询。这有可能吗?

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

【问题讨论】:

  • 只是为了澄清,您要求在不加载整个图表的情况下计算孩子(不喜欢)的数量?
  • @Rippo,是的,我只需要不喜欢计数。
  • 在这种情况下,lazy="extra" 是您的最佳选择。

标签: sql linq nhibernate hql


【解决方案1】:

您需要 1 个查询才能获得最佳性能,这是一种常见的误解。

每个连接都需要数据库执行额外的工作,并且查询的复杂性和成本会随着每个额外的连接而迅速增长。虽然关系数据库已针对处理连接进行了优化,但执行多个单独的查询通常比执行包含多个连接的单个查询更有效。

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

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

ps:不要忘记将其包装在事务中。

【讨论】:

  • 是的。但与往常一样,在您决定哪个更快之前,请先分析两者。 过早的优化通常不值得花时间。
  • 除非您在映射中添加lazy='extra',否则您将执行select * 而不是select count(*)