0

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

しかし、子サブクエリの合体で親列を取得できません。次の例外が発生します

プロパティCが見つかりませんでした。

サブクエリが子クエリでWhenAddedという列を探していることは知っていますが、親を探すように指示する方法がわかりませんか?これを達成する方法について何かアイデアはありますか?

ps。私はこれをこの変換された方法で行う必要があります。そうしないと、金額の合計が正しくなくなります。したがって、これが考慮されない限り、サブクエリなしで書き直す提案はありません。

ありがとう。

4

1 に答える 1

1

合体をサブクエリから移動し、エイリアスを使用して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();
于 2012-10-18T10:06:24.400 に答える