2015-01-05 4 views
0

Я хочу, чтобы получить следующий запрос с использованием QueryOverПочему Projections.SubQuery испортил остальную часть запроса?

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 сгенерированным

Без подзапрос

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)] 

С подзапрос (оба незакомментированной)

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)] 

Как вы можете видеть, когда я раскомментировать подзапрос, а не только делает он возвращает другие части в select, но также генерирует только один подзапрос. Зачем?

ответ

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>(); 
Смежные вопросы