2009-03-28 12 views
4

私はUser、Book、UserBooksの関連テーブルを持っています。このNHibernate:グループ化とカウント

|UserID | BookID | Status | 
    1  34  Read 
    1  35  Unread 
    2  34  Read 
    2  70  Read 
    2  32  Unread 
    ................... 

マイドメインクラスのようなUserBooksの表は、ユーザーブックUserBookです。 NHibernateでどのようにしてトップ10の最も読んだ本とその読書数をユーザーが得ることができますか?

トップ10読んだ本は

| BookID | ReadCount | 
    34   2 
    70   1 
    ............... 
+0

ステータスは「読み取り」と「未読」ではありませんか? – yfeldblum

答えて

11

あなたUserBookクラスをマッピングするために、複合要素を使用していると仮定すると:

var top10Books = session 
    .CreateQuery(@"select b.Book 
        from User u 
        join fetch u.Books b 
        where b.Status = :status") 
    .SetParameter("status", "Read") 
    .SetMaxResults(10) 
    .SetResultTransformer(CriteriaSpecification.DistinctRootEntity) 
    .List<Book>(); 

そして、ここではlinkは、完全なソースコードにあります。

EDIT:

私は、あなたが本を読まれた回数を必要としていることがわかります。クエリは次のとおりです。

var top = session 
    .CreateQuery(@"select b.Book, count(b.Book.Id) 
        from User u join fetch u.Books b 
        where b.Status = :status 
        group by b.Book") 
    .SetParameter("status", "Read") 
    .SetMaxResults(10) 
    .List<object[]>(); 

    foreach (var item in top) 
    { 
     var book = (Book)item[0]; 
     var readCount = (long)item[1]; 
     Console.WriteLine("book id: {0}, read count: {1}", book.Id, readCount); 
    } 
+1

Darin、あなたのコードスニペット(http://snipt.org/Pgo)がSnipt.orgにないようです。可能であれば、再度投稿してください。 [1]:http://snipt.org/Pgo –

関連する問題