为什么Projections.SubQuery弄乱了查询的其余部分?

时间:2015-01-05 15:08:42

标签: nhibernate queryover

我想使用QueryOver获取以下查询

    select 
    cg.CoverageGrpId, 
    SUM(cp.PremiumDueAmt) + SUM(cf.PremiumDueAmt) as TotalPremium,
    SUM(pa.PaymentAllocAmt) as AllocatedAmount, p.ClientPolicyId,
    (SELECT MAX(c2.CvrgExpDt) FROM Coverage c2 where c2.CoverageGrpId = cg.CoverageGrpId) as CoverageExpDate,
    (SELECT MIN(c3.CvrgEffDt) FROM Coverage c3 where c3.CoverageGrpId = cg.CoverageGrpId) as CoverageEffDate

from dbo.vw_D_CoverageGroup cg
    inner join dbo.vw_D_Batch b on b.PremCvrgBatchId = cg.PremCvrgBatchId
    inner join dbo.vw_D_ClientPolicy p on p.ClientPolicyId = cg.ClientPolicyId
    inner join dbo.vw_D_Bid bd on bd.BidId = p.BidId
    inner join dbo.vw_D_CoverageGroupRow cgr on cgr.CoverageGrpId = cg.CoverageGrpId
    inner join dbo.vw_D_Coverage c on c.CoverageGrpRowId = cgr.CoverageGrpRowId

    left outer join dbo.vw_D_CoveragePremium cp on c.CoverageId = cp.CoverageId
    left outer join dbo.vw_D_CoverageFee cf on cf.CoverageId = cp.CoverageId
    left outer join dbo.vw_D_PaymentAllocation pa on pa.CoverageGrpId = cg.CoverageGrpId

where c.PrimaryInsuredId = 701112800 and b.BatchTypeCd = 'INDV'
group by cg.CoverageGrpId, p.ClientPolicyId
order by cg.CoverageGrpId, p.ClientPolicyId

以下是QueryOver,一旦我添加了评论部分,它就会搞砸了。

 var dto = new InsuredCoveragePayments();

            Coverage coverage = null;
            CoverageGroup coverageGroup = null;
            CoverageGroupRow coverageGroupRow = null;
            Batch batch = null;
            PaymentAllocation paymentAllocation = null;
            CoveragePremium coveragePremium = null;
            CoverageFee coverageFee = null;
            ClientPolicy clientPolicy = null;
            Bid bid = null;

            var l = _session.QueryOver<CoverageGroup>(() => coverageGroup)
                .JoinAlias(cg => cg.Batch, () => batch)
                .JoinAlias(cg => cg.ClientPolicy, () => clientPolicy)
                .JoinAlias(cg => clientPolicy.Bid, () => bid)
                .JoinAlias(cg => cg.PaymentAllocations, () => paymentAllocation, JoinType.LeftOuterJoin)
                .JoinQueryOver(cg => cg.CoverageGroupRows, () => coverageGroupRow)
                .JoinQueryOver(cgr => cgr.Coverages, () => coverage)
                .JoinAlias(c => c.Premium, () => coveragePremium, JoinType.LeftOuterJoin)
                .JoinAlias(c => c.Fees, () => coverageFee, JoinType.LeftOuterJoin)
                .Where(x => coverage.PrimaryInsured.Id == 701112800)
                .SelectList(list =>
                    list.Select(Projections.Group<CoverageGroup>(x => x.Id))
                            .WithAlias(() => dto.CoverageGroupId)
                        .Select(Projections.Group<ClientPolicy>(x => clientPolicy.PolicyNumber))
                            .WithAlias(() => dto.ClientPolicyNumber)
                        .Select(Projections.Sum<CoveragePremium>(x => coveragePremium.Amount))
                            .WithAlias(() => dto.PremiumAmount)
                        .Select(Projections.Sum<CoverageFee>(x => coverageFee.Amount))
                            .WithAlias(() => dto.FeeAmount)
                        .Select(Projections.Sum<PaymentAllocation>(x => paymentAllocation.AllocatedAmount))
                            .WithAlias(() => dto.AllocatedAmount))
                        //this messes the query up, it removes all 'select' parts and adds only subquery

                        //.Select(Projections.SubQuery(
                        //        QueryOver.Of<Coverage>()
                        //                .Where(c => c.CoverageGroup.Id == coverageGroup.Id)
                        //                .SelectList(cl =>
                        //                    cl.SelectMin(c => c.CoverageEffectiveDates.Start.Value)
                        //                        .WithAlias(() => dto.CoverageFrom))))
                        //.Select(Projections.SubQuery
                        //        (QueryOver.Of<Coverage>()
                        //                .Where(c => c.CoverageGroup.Id == coverageGroup.Id)
                        //                .SelectList(cl2 =>
                        //                        cl2.SelectMax(c => c.CoverageEffectiveDates.End.Value)
                        //                           .WithAlias(() => dto.CoverageTo))))
               .TransformUsing(new AliasToBeanResultTransformer(typeof(InsuredCoveragePayments)))
               .List<InsuredCoveragePayments>();

NHibernate生成输出

没有SubQuery

SELECT this_.CoverageGrpId as y0_, 
clientpoli2_.Year as y1_, 
clientpoli2_.ClientNumber as y2_, 
clientpoli2_.BidOptionNumber as y3_
sum(coveragepr7_.PremiumDueAmt) as y4_, 
sum(coveragefe8_.PremiumDueAmt) as y5_, 
sum(paymentall4_.PaymentAllocAmt) as y6_ 
FROM vw_D_CoverageGroup this_ 
inner join vw_D_CoverageGroupRow coveragegr5_ on this_.CoverageGrpId=coveragegr5_.CoverageGrpId 
inner join vw_D_Coverage coverage6_ on coveragegr5_.CoverageGrpRowId=coverage6_.CoverageGrpRowId 
left outer join vw_D_CoverageFee coveragefe8_ on coverage6_.CoverageId=coveragefe8_.CoverageId 
left outer join vw_D_CoveragePremium coveragepr7_ on coverage6_.CoverageId=coveragepr7_.CoverageId
left outer join vw_D_PaymentAllocation paymentall4_ on this_.CoverageGrpId=paymentall4_.CoverageGrpId
inner join vw_D_Batch batch1_ on this_.PremCvrgBatchId=batch1_.PremCvrgBatchId
inner join vw_D_ClientPolicy clientpoli2_ on this_.ClientPolicyId=clientpoli2_.ClientPolicyId
inner join vw_D_Bid bid3_ on clientpoli2_.BidId=bid3_.BidId
WHERE coverage6_.PrimaryInsuredId = @p0
GROUP BY this_.CoverageGrpId, clientpoli2_.Year,clientpoli2_.ClientNumber,clientpoli2_.BidOptionNumber;
@p0 = 701112800 [Type: Int32 (0)]

使用SubQuery(均未注释)

SELECT 
     (SELECT max(this_0_.CvrgExpDt) as y0_ 
       FROM vw_D_Coverage this_0_ 
       WHERE this_0_.CoverageGrpId = this_.CoverageGrpId) as y0_ 
FROM vw_D_CoverageGroup this_ 
inner join vw_D_CoverageGroupRow coveragegr5_ on this_.CoverageGrpId=coveragegr5_.CoverageGrpId 
inner join vw_D_Coverage coverage6_ on coveragegr5_.CoverageGrpRowId=coverage6_.CoverageGrpRowId 
left outer join vw_D_CoverageFee coveragefe8_ on coverage6_.CoverageId=coveragefe8_.CoverageId 
left outer join vw_D_CoveragePremium coveragepr7_ on coverage6_.CoverageId=coveragepr7_.CoverageId 
left outer join vw_D_PaymentAllocation paymentall4_ on this_.CoverageGrpId=paymentall4_.CoverageGrpId
inner join vw_D_Batch batch1_ on this_.PremCvrgBatchId=batch1_.PremCvrgBatchId 
inner join vw_D_ClientPolicy clientpoli2_ on this_.ClientPolicyId=clientpoli2_.ClientPolicyId 
inner join vw_D_Bid bid3_ on clientpoli2_.BidId=bid3_.BidId 
WHERE coverage6_.PrimaryInsuredId = @p0;@p0 = 701112800 [Type: Int32 (0)]

正如您所看到的,当我取消注释SubQuery时,它不仅返回select中的其他部分,而且还只生成一个子查询。为什么呢?

1 个答案:

答案 0 :(得分:0)

想出来。在SubQuery部分中,我将WithAlias放在错误的位置。看起来应该是这样的

        var l = _session.QueryOver<CoverageGroup>(() => coverageGroup)
            .JoinAlias(cg => cg.Batch, () => batch)
            .JoinAlias(cg => cg.ClientPolicy, () => clientPolicy)
            .JoinAlias(cg => clientPolicy.Bid, () => bid)
            .JoinAlias(cg => cg.PaymentAllocations, () => paymentAllocation, JoinType.LeftOuterJoin)
            .JoinQueryOver(cg => cg.CoverageGroupRows, () => coverageGroupRow)
            .JoinQueryOver(cgr => cgr.Coverages, () => coverage)
            .JoinAlias(c => c.Premium, () => coveragePremium, JoinType.LeftOuterJoin)
            .JoinAlias(c => c.Fees, () => coverageFee, JoinType.LeftOuterJoin)
            .Where(x => coverage.PrimaryInsured.Id == 701112800)
            .SelectList(list =>
                list
                    .Select(Projections.Group<CoverageGroup>(x => x.Id))
                        .WithAlias(() => dto.CoverageGroupId)
                    .Select(Projections.Group<ClientPolicy>(x => clientPolicy.PolicyNumber))
                        .WithAlias(() => dto.ClientPolicyNumber)
                    .Select(Projections.Sum<CoveragePremium>(x => coveragePremium.Amount))
                        .WithAlias(() => dto.PremiumAmount)
                    .Select(Projections.Sum<CoverageFee>(x => coverageFee.Amount))
                        .WithAlias(() => dto.FeeAmount)
                    .Select(Projections.Sum<PaymentAllocation>(x => paymentAllocation.AllocatedAmount))
                        .WithAlias(() => dto.AllocatedAmount)
                    .Select(Projections.SubQuery
                            (QueryOver.Of<Coverage>()
                                    .Where(c => c.CoverageGroup.Id == coverageGroup.Id)
                                    .SelectList(cl =>
                                        cl.SelectMin(c => c.CoverageEffectiveDates.Start.Value))))
                          .WithAlias(() => dto.CoverageFrom)
                    .Select(Projections.SubQuery
                           (QueryOver.Of<Coverage>()
                                    .Where(c => c.CoverageGroup.Id == coverageGroup.Id)
                                    .SelectList(cl2 =>
                                            cl2.SelectMax(c => c.CoverageEffectiveDates.End.Value))))
                         .WithAlias(() => dto.CoverageTo) )
           .TransformUsing(new AliasToBeanResultTransformer(typeof(InsuredCoveragePayments)))
           .List<InsuredCoveragePayments>();