使用nHibernate分组By和Count

时间:2010-09-01 16:09:22

标签: nhibernate count group-by

想象一下下面的表格:

  

标记(TagId,标签)

     

发布(PostId,标题,内容)

     

用户(UserId,姓名)

     

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>(); 

你能帮帮我吗?

非常感谢!

抱歉我的英文......

此致

安托

2 个答案:

答案 0 :(得分:0)

如果我是对的,请创建如下的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))

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

答案 1 :(得分:0)

如果我是你,我会为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。:我没有检查代码是否完全正确,只是提出一个想法。