2010-09-01 52 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 .:我沒有檢查代碼是否完全正確,只是給出一個想法。