2012-08-17 161 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是一個相當古老的博客文章;語法現在已更改爲允許使用lambda表達式)。

關於前15% - 我不確定。
QueryOver().Take()允許恆定;不確定是否有百分比的本機支持。
雖然你可以實現自己的投影。見here

編輯:一個簡單的投影實例
我怎麼偷懶,可以嗎?我剛剛從github複製了這個。
它有加入,別名,預測..你需要的一切。我只是爲了好玩而添加了SUM投影。
通知所有其他屬性怎麼也得進行分組,通過,當然:

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

我沒有想到的解決辦法投影的。很簡約。 – 2012-08-17 14:38:26

+0

任何一個例子的改變?只是聚合。漂亮請:-) – 2012-08-17 15:38:22

+0

@禪-C我編輯我的答案包括一個小例子 – 2012-08-17 16:01:12

0

TOP n PERCENT是一個非標準的SQL結構(一個非常有用,我可以補充)

有用於在任何NH查詢方法不支持。只要保持它爲SQL。