2012-08-17 202 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。