使用 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 分组和计数的主要内容,如果未能解决你的问题,请参考以下文章