Nhibernate 将HQL查询转换为条件会生成无效的SQL

Nhibernate 将HQL查询转换为条件会生成无效的SQL,nhibernate,Nhibernate,我正在尝试将以下HQL查询转换为条件 from SubportfolioAudit as a where a.ID in (select max(a2.ID) from SubportfolioAudit as a2 where a2.EffectiveDate = :EffectiveDate and a.Subportfolio.ID = a2.Subportfolio.ID

我正在尝试将以下HQL查询转换为条件

from SubportfolioAudit as a
where a.ID in (select max(a2.ID)
                from SubportfolioAudit as a2
                where a2.EffectiveDate = :EffectiveDate
                    and a.Subportfolio.ID = a2.Subportfolio.ID
                group by a2.Subportfolio.ID)
and a.Subportfolio.ID in (:SubportfolioList)
到目前为止,我有以下几点:

var crit =  Session.CreateCriteria(typeof(SubportfolioAudit));
var currentAuditByEffectiveDate = DetachedCriteria.For(typeof(SubportfolioAudit))
                                  .SetProjection(Projections.ProjectionList()
                                                    .Add(Projections.Max("ID"))
                                                    .Add(Projections.GroupProperty("Subportfolio.ID")))
                                  .Add(Expression.Eq("EffectiveDate", effectiveDate));

crit.Add(Subqueries.PropertyIn("ID", currentAuditByEffectiveDate));
crit.Add(Expression.In("Subportfolio.ID", subportfolioList.Select(x => x.ID).ToArray()));

return crit.List<SubportfolioAudit>();
我知道Projections.GroupProperty()导致了这个问题,但我似乎无法找到另一种方法来实现我想要的。

我相信(如果我错了,请纠正我)子查询是无效的,因为您缺少在HQL中设置的第二个where子句(…和a.Subportfolio.ID=a2.Subportfolio.ID)

我相信(无法验证,因为我无法测试您的代码)按照下面的方式转换您的条件查询会成功

var crit = Session.CreateCriteria(typeof(SubportfolioAudit), "mainQuery");
var currentAuditByEffectiveDate = DetachedCriteria.For(typeof(SubportfolioAudit),"subQuery")
              .SetProjection(Projections.ProjectionList()
                                .Add(Projections.Max("ID"))
                                .Add(Projections.GroupProperty("Subportfolio.ID")))
              .Add(Expression.Eq("EffectiveDate", effectiveDate));
              .Add(Expression.EqProperty("subQuery.ID", "mainQuery.ID"));

crit.Add(Subqueries.PropertyIn("mainQuery.ID", currentAuditByEffectiveDate));
crit.Add(Expression.In("mainQuery.Subportfolio.ID", subportfolioList.Select(x => x.ID).ToArray()));

return crit.List<SubportfolioAudit>();
var crit=Session.CreateCriteria(typeof(SubportfolioAudit),“mainQuery”);
var currentAuditByEffectiveDate=DetachedCriteria.For(typeof(SubportfolioAudit),“subQuery”)
.SetProjection(Projections.ProjectionList()项目)
.Add(Projections.Max(“ID”))
.Add(projects.GroupProperty(“Subportfolio.ID”))
.Add(Expression.Eq(“EffectiveDate”,EffectiveDate));
.Add(Expression.EqProperty(“subQuery.ID”、“mainQuery.ID”);
添加(subquerys.PropertyIn(“mainQuery.ID”,currentAuditByEffectiveDate));
Add(Expression.In(“mainQuery.Subportfolio.ID”,subportfolioList.Select(x=>x.ID.ToArray());
返回crit.List();

我所做的是在DetachedCriteria中添加一个额外的where子句,该子句将子查询的SubportfoliAudit.ID列与外部主查询“连接”。我还提供了别名来命名查询

但是你为什么要设置Projections.Max(“ID”)?是的,你的代码也会产生同样的问题。基本上,子查询返回两列,这两列在in语句中使用,这是无效的。它必须完全删除group属性,但无论如何都不需要。谢谢你是对的。我相信您最初的标准代码有一个问题,我的解决方案解决了这个问题,但它与您请求帮助的问题不同。对不起。。。尽管如此,当通过ICriteria/DetachedCriteria接口使用时,NHibernate将在select语句中添加GroupBy列。我相信这是没有办法的。我希望我错了。
var crit = Session.CreateCriteria(typeof(SubportfolioAudit), "mainQuery");
var currentAuditByEffectiveDate = DetachedCriteria.For(typeof(SubportfolioAudit),"subQuery")
              .SetProjection(Projections.ProjectionList()
                                .Add(Projections.Max("ID"))
                                .Add(Projections.GroupProperty("Subportfolio.ID")))
              .Add(Expression.Eq("EffectiveDate", effectiveDate));
              .Add(Expression.EqProperty("subQuery.ID", "mainQuery.ID"));

crit.Add(Subqueries.PropertyIn("mainQuery.ID", currentAuditByEffectiveDate));
crit.Add(Expression.In("mainQuery.Subportfolio.ID", subportfolioList.Select(x => x.ID).ToArray()));

return crit.List<SubportfolioAudit>();