0

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

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

非常感谢

4

2 回答 2

4

使用 . 连接很容易.Join()。如果您已经在映射中定义了这些关系,那么您甚至不必指定连接的方式。
我通常觉得使用起来更方便JoinAlias。聚合是使用完成的(请参阅此处Projections的别名和投影)。

当然,您需要一个简单的总和投影和一个分组投影。

对于结果,您可以使用 anobject []并强制转换它(如上面的链接中所示),或者您可以定义自定义 DTO,然后使用AliasToBeanResultTransformer. (是一篇相当古老的博客文章;语法现在已更改为允许 lambda 表达式)。

关于前 15% - 我不确定。
QueryOver().Take()允许一个常数;不确定是否有对百分比的本机支持。
不过,您可以实现自己的投影。看这里

编辑:一个简单的投影示例
我有多懒惰?我刚刚从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>();
于 2012-08-17T14:26:49.280 回答
0

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

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

于 2012-08-17T14:25:02.717 回答