【问题标题】:nHibernate aggregate querynHibernate 聚合查询
【发布时间】:2012-08-17 13:31:58
【问题描述】:

我正在尝试将以下 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 限制(人员 --> 会话 --> 标记)。

有人能给我一些建议吗?

非常感谢

【问题讨论】:

    标签: nhibernate projection queryover


    【解决方案1】:

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

    【讨论】:

    • 例子有什么变化吗?只是聚合。漂亮请:-)
    【解决方案2】:

    TOP n PERCENT 是一个非标准的 SQL 结构(我可能会补充一个非常有用的结构)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2013-12-06
      • 2021-09-27
      • 2012-11-07
      相关资源
      最近更新 更多