nHibernate聚合查询

时间:2012-08-17 13:31:59

标签: nhibernate projection queryover

我正在尝试将以下SQL查询放入nHiberate QueryOver语句中,而且我失败了。

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约束(人 - >会话 - >标记)。

有人可以给我一些建议吗?

非常感谢

2 个答案:

答案 0 :(得分:4)

使用.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>();

答案 1 :(得分:0)

TOP n PERCENT是一个非标准的SQL构造(非常有用,我可以添加)

任何NH查询方法都不支持。只需将其保留为SQL。

相关问题