NHibernate ICritera子查询与父值合并

NHibernate ICritera子查询与父值合并,nhibernate,Nhibernate,我想从ICriteria生成以下sql select c.Id, sum(c.Amount) Amount, (select COALESCE(max(AuditDate), c.WhenAdded) FROM Audit a WHERE c.Id = a.CId) StatusDate from c join l on c.Id = l.CId Group By c.Id, c.WhenAdded 到目前为止我有 ICriteria crit

我想从ICriteria生成以下sql

select   c.Id, 
       sum(c.Amount) Amount,
       (select COALESCE(max(AuditDate), c.WhenAdded) FROM Audit a WHERE c.Id = a.CId) StatusDate
from    c
join    l
on  c.Id = l.CId
Group By c.Id, c.WhenAdded
到目前为止我有

ICriteria crit = CurrentSession.CreateCriteria<C>()
     .CreateAlias("L", "l")
     .SetProjection(Projections.ProjectionList()
     .Add(Projections.Group<C>(x => x.Id), "Id")
     .Add(Projections.Sum("l.Amount"), "Amount")
     .Add(Projections.SubQuery(DetachedCriteria.For<Audit>("ca")
        .SetProjection(Projections.ProjectionList().Add(
              Projections.SqlFunction("COALESCE", 
                NHibernateUtil.DateTime, 
                Projections.Max<ClaimAudit>(x=> x.AuditDate),
                Projections.Property<C>(x => x.WhenAdded)), "StatusDate"))))
     .SetResultTransformer(Transformers.AliasToBean<CDto>());
ICriteria crit=CurrentSession.CreateCriteria()
.CreateAlias(“L”、“L”)
.SetProjection(Projections.ProjectionList()项目)
.Add(projects.Group(x=>x.Id),“Id”)
.添加(预测金额(“l.金额”),“金额”)
.Add(Projections.SubQuery)(DetachedCriteria.For(“ca”)
.SetProjection(Projections.ProjectionList().Add(
Projections.SqlFunction(“合并”,
NHibernateUtil.DateTime,
Projections.Max(x=>x.AuditDate),
Projections.Property(x=>x.WhenAdded),“StatusDate”))
.SetResultTransformer(Transformers.AliasToBean());
但是我无法在子查询的合并中获取父列

添加时找不到属性C

我知道子查询正在子查询中查找名为WhenAdded的列,但不确定如何告诉它在父查询中查找? 有什么办法可以做到这一点吗

另外,我需要这样做,否则我会得到一个不正确的金额总和。因此,除非考虑到这一点,否则没有子查询,不建议重新编写


谢谢。

将合并从子查询中移出,并使用别名限制Adit条目

ICriteria crit = CurrentSession.CreateCriteria<C>("c")
     .CreateAlias("L", "l")
     .SetProjection(Projections.ProjectionList()
         .Add(Projections.Group<C>(x => x.Id), "Id")
         .Add(Projections.Group<C>(x => x.WhenAdded), "WhenAdded")
         .Add(Projections.Sum("l.Amount"), "Amount")
         .Add(Projections.SqlFunction("COALESCE", NHibernateUtil.DateTime, 
             Projections.SubQuery(DetachedCriteria.For<Audit>()
                 .Add(Restrictions.PropertyEq("C.Id", "c.Id")
                 .SetProjection(Projections.Max<ClaimAudit>(x=> x.AuditDate)),
             Projections.Property<C>(x => x.WhenAdded)), "StatusDate")))
     // AliasToBean !?
     .List();
ICriteria crit=CurrentSession.CreateCriteria(“c”)
.CreateAlias(“L”、“L”)
.SetProjection(Projections.ProjectionList()项目)
.Add(projects.Group(x=>x.Id),“Id”)
.Add(projects.Group(x=>x.WhenAdded),“WhenAdded”)
.添加(预测金额(“l.金额”),“金额”)
.Add(projects.SqlFunction(“COALESCE”),NHibernateUtil.DateTime,
Projections.SubQuery(DetachedCriteria.For())
.Add(限制、财产)Q(“C.Id”、“C.Id”)
.SetProjection(projects.Max(x=>x.AuditDate)),
Projections.Property(x=>x.WhenAdded)),“StatusDate”))
//别名比恩!?
.List();

snap,这就是我在大约2小时前发现的:)