我正在尝试将以下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约束(人 - >会话 - >标记)。
有人可以给我一些建议吗?
非常感谢
答案 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。