使用 nHibernate 分组和计数

Posted

技术标签:

【中文标题】使用 nHibernate 分组和计数【英文标题】:Group By and Count using nHibernate 【发布时间】:2011-04-06 21:50:27 【问题描述】:

想象以下表格:

标签(TagId、标签)

帖子(PostId、标题、内容)

用户(用户 ID、名称)

UserPostTag(Id、UserId、PostId、TagId)

对于一个帖子,多个用户可以添加一个或多个标签。

我想通过 nHibernate 获取帖子的标签列表,以及每个标签的计数。

例子或结果:

Tag(id1, label1), 7

Tag(id2, label2), 5

Tag(id3, label3), 2

我知道如何获取帖子的标签列表:

IList<Tag> tagList = session.CreateCriteria<Tag>()
 .Add(Subqueries.PropertyIn("TagId",
     DetachedCriteria.For<UserPostTag>()
         .Add(Restrictions.Eq("Post.PostId", 17))
         .SetProjection(Projections.Property("Tag.TagId"))
     ))
     .List<Tag>(); 

你能帮帮我吗?

非常感谢!

对不起我的英语......

此致,

安东尼

【问题讨论】:

以下查询几乎可以满足我的要求(我删除了对 Post id 的限制): IList tagList = session.CreateQuery("select tag.Id, tag.Label, count(cloud.User) " + "从 UserPostTag 云加入 cloud.Tag 标签" + "group by tag.Id, tag.Label").List();问题是想要得到一个标签/计数数组。你有想法吗?谢谢 【参考方案1】:

如果我是对的,请像这样创建 HQL 查询:

@"SELECT new Tag(tag.Id, tag.Label), count(cloud.User)
FROM UserPostTag cloud 
    JOIN cloud.Tag tag
WHERE cloud.Post.Id = :postId
GROUP BY tag.Id, tag.Label"

在 CreateQuery 调用中输入这个,它只有在 Tag 上有一个接受 id 和标签的构造函数时才有效。 (不要忘记设置 postId 参数。)

我相信这会返回一个带有标签和列表的列表。

更新:如果这不起作用,您可以创建一个包含标签和计数的新类 TagCount,并将选择语法更改为如下所示:

SELECT new TagCount(tag.Id, tag.Label, count(cloud.User))

(免责声明:我没有尝试过。)

【讨论】:

【参考方案2】:

如果我是你,我会为 Post 类创建一个额外的成员,将其命名为 Tags 并将其多对多映射到您的 UserPostTag 表。在这种情况下,您可以使用以下代码来完成您的任务:

创建一个类来检索你的结果:

class TagWithCount

  public string Label get;set;
  public int Count get;set;

创建查询(使用 QueryOver):

Tag ta = null;
TagWithCount res = null;

var query = QueryOver.Of<Post>()
  .JoinAlias(x=>x.Tags, ()=>ta)
  .SelectList(x=>x.SelectGroup(() => ta.Label).WithAlias(() => res.Label),
                  .SelectCount(p=>p.Id).WithAlias(() => res.Count))
  .Where(x=>x.Id == postId)
  .TransformUsing(Transformers.AliasToBean<TagWithCount>());

选择实际结果:

var res = query.GetExecutableQueryOver(session).List<TagWithCount> ();

P.S.:我没有检查代码是否完全正确,只是提供一个想法。

【讨论】:

以上是关于使用 nHibernate 分组和计数的主要内容,如果未能解决你的问题,请参考以下文章

NHIbernate 和安全/业务层

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

使用 NHibernate 的示例查询

Abp.NHibernate连接PostgreSQl数据库

csharp 按sql #NHibernate分组

NHibernate左连接选择计数在一对多关系中