2

我有这样的 SQL 查询:

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

我想创建能够为我执行此操作的 NHibernate 查询。我尝试使用QueryOver,但它不起作用。你有什么建议吗?

4

1 回答 1

3

NHibernate 甚至支持这种查询。请在文档中查看更多信息:15.8。分离的查询和子查询。我们只需要将查询(如您的 SQL 片段)分成两部分:

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

让我们假设,dbo.table1Questin 中的 被映射到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。预测、聚合和分组

于 2013-05-20T17:28:38.623 回答