2009-03-28 6 views
4

J'ai une table de releastion User, Book et UserBooks. UserBooks table comme ceNHibernate: Grouper par et Nombre

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

Mes classes de domaine sont utilisateur, livre et UserBook. Dans NHibernate, comment puis-je obtenir les 10 livres les plus lus et leur nombre de lectures par les utilisateurs?

Top 10 lire des livres

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

Les statuts ne sont pas "lus" et "non lus"? – yfeldblum

Répondre

11

En supposant que vous utilisez-élément composite pour mapper votre classe 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>(); 

Et voici le link au code source complet.

EDIT:

Je vois que vous avez besoin du nombre de fois qu'un livre a été lu. Voici la requête:

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, votre extrait de code (http://snipt.org/Pgo) semble être absent de Snipt.org. S'il vous plaît re-publier si possible. [1]: http://snipt.org/Pgo –