使用Nhibernate在子查询中仅选择不带group by子句的max子句

时间:2013-05-20 16:43:50

标签: asp.net nhibernate subquery grouping

我有这样的SQL查询:

select * from dbo.table1 where Id in
(
    select max(id) as id from dbo.table1 group by prop1, prop2, prop3
)

我想创建NHibernate查询,它能够为我做这个。我尝试使用QueryOver但它不起作用。你有什么建议吗?

1 个答案:

答案 0 :(得分:3)

NHibernate甚至支持这种查询。请在文档中查看更多内容:15.8. Detached queries and subqueries。我们只需将查询(如在您的SQL代码段中)分成两部分:

  • 内部选择
  • 带有IN子句的选择

我们假设,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>();

也可能是15.7. Projections, aggregation and grouping