2012-08-17 4 views
0

다음 SQL 쿼리를 nHiberate QueryOver 문에 넣으려고 시도하는 중 비참하게 실패합니다.nHibernate 집계 쿼리

Select top 15 percent 
    People.personId 
,People.Name 
    ,SUM(Marks.Score) 
from 
    People 
    inner join [sessions] on [sessions].PersonId = People.PersonId 
    inner join Marks on Marks.SessionId = [Sessions].SessionId 
group by 
    People.Name 
    ,People.PersonId 
order by 
    SUM(Marks.Score) asc 

내 목적은 다음과 같습니다

  • 사람
  • 세션
  • 마크 명백한 FK 제약으로

(명 -> 세션 -> 마크).

누군가 내가 조언을 해줄 수 있습니까?

많은 감사

답변

3

조인은 .Join()으로 충분합니다. 매핑에서 이러한 관계를 정의한 경우 조인 방법을 지정하지 않아도됩니다.
나는 보통 JoinAlias을 사용하는 것이 더 편리하다고 생각합니다. 집계는 Projections을 사용하여 수행됩니다 (별칭 및 예상 내용 here 참조).

간단한 합계 투영과 그룹 투영이 필요합니다.

결과로 object []을 사용하고 위의 링크와 같이 캐스팅하거나 사용자 정의 DTO를 정의하고 AliasToBeanResultTransformer을 사용할 수 있습니다. (here은 꽤 오래된 블로그 게시물이며 구문은 이제 람다 식을 허용하도록 변경되었습니다).

상위 15 %에 대해서는 확실하지 않습니다.
QueryOver().Take()은 상수를 허용합니다. 비율에 대한 기본 지원이 있는지 확신하지 못합니다.
그래도 자신 만의 프로젝션을 구현할 수 있습니다. here을 참조하십시오.

편집 : 간단한 프로젝션 예제
얼마나 게으름니까? 방금 github에서 복사했습니다.
조인, 별칭, 투영 등이 있습니다. 필요한 모든 것. 재미로 SUM 프로젝션을 추가했습니다. 다른 모든 속성을 그룹화별로 할 물론 얼마나
주의 사항 : I 투사 해결 방법을 생각하지 않았다

Customer customer = null; 
    Employee employee = null; 
    OrderHeader orderHeader = null; 

    var orderHeaders = Session.QueryOver<Order>() 
     .JoinAlias(o => o.Customer,() => customer) 
     .JoinAlias(o => o.Employee,() => employee) 
     .SelectList(list => list 
      .SelectGroup(o => o.OrderedOn).WithAlias(() => orderHeader.OrderedOn) 
      .SelectGroup(o => customer.Name).WithAlias(() => orderHeader.Name) 
      .SelectGroup(o => employee.FirstName).WithAlias(() => orderHeader.FirstName) 
      .SelectGroup(o => employee.LastName).WithAlias(() => orderHeader.LastName) 
      .SelectSum(o => employee.Salary).WithAlias(() => orderHeader.JhonnysProjectionExample)) 
     .TransformUsing(Transformers.AliasToBean<OrderHeader>()) 
     .List<OrderHeader>(); 
+0

. 꽤 깔끔한. –

+0

예제가 변경 되었습니까? 단지 집계의. 예쁘게 :-) –

+0

@ Zen-C 약간의 예를 들어 나의 대답을 편집했습니다 –

0

TOP n PERCENT는 비표준 SQL 구문 어떤 NH 쿼리 방법이에 대한 지원이 없다

(매우 유용 하나, 내가 추가 할 수 있습니다). 그냥 SQL로 유지하십시오.