咨询NHibernate是否支持Partition By Over子句及QueryOver写法
NHibernate对Partition By Over子句的支持及QueryOver实现
是否支持RANK()/ROW_NUMBER()的Partition By Over子句
NHibernate 3.0及以上版本原生支持使用ROW_NUMBER()、RANK()这类窗口函数的Partition By Over子句,你可以通过SQL投影的方式在QueryOver查询中直接使用这类语法。
目标SQL对应的QueryOver查询实现
首先需要定义一个用于接收查询结果的DTO类(如果不需要强类型结果,也可以跳过这一步直接返回匿名类型):
public class OrderLineResult { public string OrderNumber { get; set; } public int OrderLine { get; set; } }
接下来编写QueryOver查询代码,通过Projections.SqlProjection嵌入窗口函数:
// 初始化DTO用于别名映射 var resultDto = new OrderLineResult(); var queryResult = session.QueryOver<Table1>() .SelectList(select => select // 映射ORDERNUMBER字段到DTO的OrderNumber属性 .Select(entity => entity.OrderNumber).WithAlias(() => resultDto.OrderNumber) // 嵌入ROW_NUMBER()窗口函数SQL,指定别名、列名和数据类型 .Select(Projections.SqlProjection( "ROW_NUMBER() OVER (PARTITION BY this_.ORDERNUMBER) as orderline", new[] { "orderline" }, new IType[] { NHibernateUtil.Int32 } )).WithAlias(() => resultDto.OrderLine) ) // 将查询结果转换为DTO对象 .TransformUsing(Transformers.AliasToBean<OrderLineResult>()) .List<OrderLineResult>();
关键细节说明
Projections.SqlProjection用于直接自定义SQL片段,这里嵌入了窗口函数逻辑,同时指定了返回列的名称和NHibernate数据类型WithAlias配合Transformers.AliasToBean实现查询结果到DTO的自动映射- 确保实体
Table1的OrderNumber属性与数据库字段ORDERNUMBER的映射关系正确 - 窗口函数的语法需匹配你使用的数据库(如SQL Server、PostgreSQL等,语法基本一致)
内容的提问来源于stack exchange,提问作者Manjusha
相关产品推荐
相关产品推荐

