我有这样的SQL查询:
select * from dbo.table1 where Id in
(
select max(id) as id from dbo.table1 group by prop1, prop2, prop3
)
我想创建NHibernate查询,它能够为我做这个。我尝试使用QueryOver
但它不起作用。你有什么建议吗?
答案 0 :(得分:3)
NHibernate甚至支持这种查询。请在文档中查看更多内容:15.8. Detached queries and subqueries。我们只需将查询(如在您的SQL代码段中)分成两部分:
我们假设,Questin中的dbo.table1
被映射到MyEntity
。
要创建内部选择,我们使用DetachedCriteria
编辑(由小组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>();