【问题标题】:Getting a row count on joined tables using NHibernate使用 NHibernate 获取连接表的行数
【发布时间】:2012-06-01 21:43:40
【问题描述】:

我有一个由以下 3 个表组成的多对多关系(不相关的字段已从简洁中删除),其中一个广告可以分配多个标签,一个标签可以分配给多个广告。

广告

(PK) Id

广告标签

(FK) AdvertId
(FK) TagId

标签

(PK) Id

我想创建一个 NHibernate 查询来计算分配了特定标签(即特定 TagId)的广告数。

在普通的 sql 中,我会按照以下方式做一些事情:

SELECT COUNT(*)
FROM Adverts A
JOIN AdvertsTags AT ON A.Id = AT.AdvertId
WHERE AT.TagId = @tagId

我的AdvertTag 模型的属性名称与上表中的字段名称一致。

我不知道使用 NHibernate 的推荐方法是什么?

【问题讨论】:

  • 假设您的对象映射正确,是否有原因您不能按 Id 检索标签然后使用 Tag.Adverts.Count?
  • 我认为这会对性能产生影响,检索所有广告的完整列表然后对其进行计数(当我不需要分配给给定的广告的完整列表时)标记,只是计数 - 当我需要分配给标记的广告列表时,我将有分页方法一次只返回 x 行,我需要)。
  • 如果我正确理解了 NHibernate 实现,延迟加载集合并在其上调用 Count() 不应导致将所有项目存储在内存中。如果您已经有一个数据库启动并运行,您可以检查 nhibernate 生成的查询。当然,考虑到您已经有一个公认的答案,它可能不再相关了:-)

标签: asp.net nhibernate nhibernate-criteria


【解决方案1】:

也许这样的事情会有所帮助:

var count = session
    .CreateCriteria(typeof(Advert))
    .SetProjection(Projections.RowCount())
    .CreateCriteria("Tags")
    .Add(Expression.Eq("TagId", tagId)
    .UniqueResult<long>();

更多信息在这里:http://www.nhforge.org/doc/nh/en/index.html#querycriteria-associations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多