2010-09-01 55 views
4

试想下表:集团通过和Count使用NHibernate

标签(标签识别,标签)

邮政(帖子ID,标题,内容)

用户( UserId,Name)

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

你能帮帮我吗?

非常感谢!

对不起,我的英语...

真诚,

安东尼

+1

下面的查询做几乎我想要的东西(我就删除帖子的ID的限制): IList的标记列表= session.CreateQuery( “选择tag.Id,tag.Label,计数(cloud.User)” +“从UserPostTag云加入云。标签“ +”group by tag.Id,tag.Label“)。List(); 问题是,想获得一个Tag/count数组。 你有想法吗? 谢谢 – Antoine 2010-09-02 10:18:41

回答

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调用,它只有在标签上有一个构造函数时才有效,它接受一个id和一个标签。 (不要忘记设置postId参数。)

这相当于返回一个数组中的标签和列表的列表。

更新:如果这不起作用,你可以创建一个新的类TagCount具有标签和数量,改变选择语法类似如下:

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

(声明:我没有试试吧。)

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 .:我没有检查代码是否完全正确,只是给出一个想法。