我有这样的 SQL 查询:
select * from dbo.table1 where Id in
(
select max(id) as id from dbo.table1 group by prop1, prop2, prop3
)
我想创建能够为我执行此操作的 NHibernate 查询。我尝试使用QueryOver
,但它不起作用。你有什么建议吗?
我有这样的 SQL 查询:
select * from dbo.table1 where Id in
(
select max(id) as id from dbo.table1 group by prop1, prop2, prop3
)
我想创建能够为我执行此操作的 NHibernate 查询。我尝试使用QueryOver
,但它不起作用。你有什么建议吗?
NHibernate 甚至支持这种查询。请在文档中查看更多信息:15.8。分离的查询和子查询。我们只需要将查询(如您的 SQL 片段)分成两部分:
让我们假设,dbo.table1
Questin 中的 被映射到MyEntity
. 要创建内部选择,让我们使用DetachedCriteria
编辑(与 Group by 扩展,SqlGroupProjection
)
有一个SqlGroupProjection
方法的摘录:
分组 SQL 投影,同时指定 select 子句和 group by 子句片段
// inner select
DetachedCriteria innerSelect = DetachedCriteria
.For(typeof(MyEntity))
.SetProjection(
Projections.ProjectionList()
.Add(
Projections.SqlGroupProjection(
" MAX(ID) ", // SELECT ... max(ID) only
" Prop1, Prop2, Prop3", // GROUP BY ... property1, p2...
new string[] {"ID"}, // could be empty, while not used for
new IType[] { NHibernate.NHibernateUtil.Int32 } // transformation
)
)
;
注意:我什至提供了最后两个参数,但在这种情况下它们可能是空的new string[], new IType[] {}
:这些仅用于转换(从数据到实体的具体化)。事实并非如此,我们只是在构建内部选择......
// the select with IN clause
var result = session.CreateCriteria(typeof(MyEntity))
.Add(Subqueries.PropertyIn("ID", innerSelect))
.List<MyEntity>();
也相关的可能是15.7。预测、聚合和分组