2014-09-01 118 views
1

請幫忙,我可以在nhibernate上查詢嗎?羣組查詢返回最大值的返回列表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)); 

,但它不工作。它將返回表中的所有數據。我只想從每個用戶那裏獲取最後的序列號。

請大家幫忙。謝謝

回答

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