2012-10-17 72 views
0

我想從的ICriteriaNHibernate的ICritera子查詢合併與父值

生成的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>()); 

,但我不能在的聚結得到父列子子查詢。我得到下面的異常

找不到財產C.WhenAdded

我知道,子查詢是尋找在子查詢稱爲WhenAdded列,但不知道如何告訴它的父看? 關於如何實現這一點的任何想法?

ps。我需要以這種融合的方式來做到這一點,否則我會得到不正確的金額總和。所以沒有任何建議可以在沒有子查詢的情況下重新編寫,除非這是考慮到的。

謝謝。

回答

1

移動從子查詢中聚結並使用別名來限制平硐項

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(); 
+0

扣,我是這麼領悟了約2小時前:) – sianabanana