2009-03-28 5 views
4

나는 User, Book 및 UserBooks releation 테이블을 가지고있다. 이NHibernate : Group by and Count

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

내 도메인 클래스와 같은 UserBooks 표 사용자, 예약UserBook 있습니다. NHibernate에서 사용자가 가장 많이 읽는 책 10 권과 그 읽기 수를 어떻게 얻을 수 있습니까?

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있어 :

상위 10 개 읽기 책

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

상태는 "읽음"및 "읽지 않음"이 아닙니까? – yfeldblum

답변

11

당신이 당신의 UserBook 클래스를 매핑하는 복합 요소를 사용하는 가정.

편집 :

난 당신이 책을 읽은 횟수를 요구하는 것을 볼 수

. 다음은 쿼리입니다.

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 –