2014-09-01 3 views
1

nhibernate를 통해 쿼리에서이 작업을 수행 할 수 있습니까?그룹 QueryOver 이후 최대 값 목록 Nhibernate

select max(Id) from transTable 
group by PortfolioId. 

나는 이것을 시도했다.

var subquery = QueryOver.Of(() => q) 
         .SelectList(list => list.SelectGroup(() => q.PortfolioId)) 
          .Where(Restrictions.EqProperty(
           Projections.Property(() => p.Id), 
           Projections.Max(() => q.Id))) 
          .And(Restrictions.EqProperty(
           Projections.Property(() => p.Id), 
           Projections.Property(() => q.Id))); 

다음

var filter = QueryOver.Of(() => p) 
         .WithSubquery.WhereExists(subquery) 
         .Select(Projections.Property(()=>p.Id)); 

하지만이 작동하지 않습니다. 테이블에서 모든 데이터를 리턴합니다. 나는 모든 사용자로부터 마지막 ​​sequenceID를 얻고 싶다.

도와주세요. 감사합니다.

답변

1

나는 거의 당신이 있다고 말할 것입니다. 필터 된 항목 목록을 얻으려면 조정해야합니다.

// group by PortfolioId 
// HAVING for outer 'p.ID' 
var subquery = QueryOver.Of(() => q) 
    .SelectList(list => list 
     .SelectGroup(() => q.PortfolioId) 
     .SelectMax(() => q.Id) 
    ) 
    .Where(Restrictions.EqProperty(// HAVING 
     Projections.Property(() => p.Id), 
     Projections.Max(() => q.Id))) 
    ; 

// now select the list of p.Id, prefiltered by above subquery 
var filter = QueryOver.Of(() => p) 
    .WithSubquery.WhereExists(subquery) 
    .Select(Projections.Property(() => p.Id)); 

// finally the result as a set of q entities 
// ready for paging 
var result = session.QueryOver(() => q) 
    .WithSubquery 
     .WhereProperty(() => q.Id) 
     .In(filter) 
    // .Skip(0) -- paging could be used 
    // .Take(25) 
    .List() 
    ; 

확인이 유사한 쿼리에 정의 된 SQL의 구조 : Query on HasMany reference