使用 . 连接很容易.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>();