2016-03-03 95 views
0

我想翻译一下我写给Linq过去几天的查询,我似乎无法使它工作。这是我试图翻译的查询:C#Linq嵌套GroupBy和总和

SELECT 
    hsd.CoveragePeriodBeginDate, 
    RateTotal   = SUM(hsd.Rate), 
    ReimbursementTotal = SUM(hsd.TotalReimbursement), 
    AdjustmentsTotal = SUM(hsd.Adjustments) 
FROM 
    ( SELECT 
      CoveragePeriodBeginDate, 
      PaidDate, 
      Rate    = TotalClaimCharge, 
      TotalReimbursement = ReimbursementAmount, 
      Adjustments   = SUM(BaseRateChangeAmount) 
     FROM 
      dbo.HsdMonthlyCapitatation 
     WHERE 
      MemberID = 12345678 
     GROUP BY 
      CoveragePeriodBeginDate, 
      PaidDate, 
      TotalClaimCharge, 
      ReimbursementAmount 
    ) hsd 
GROUP BY 
    hsd.CoveragePeriodBeginDate 
ORDER BY 
    hsd.CoveragePeriodBeginDate 

我需要做的是将其转换成Linq。我尝试了许多不同的方式,但似乎无法使其正确工作。它似乎总是过多。

这是我最近来的。

var rawCapData = db.HsdMonthlyCapitations.Where(x => x.MemberID == memberID) 
    .Select(x => new { 
         CoveragePeriod = x.CoveragePeriodBeginDate, 
         TotalCharge = x.TotalClaimCharge, 
         Reimbursement = x.ReimbursementAmount, 
         PaidDate = x.PaidDate, 
         Adjust = x.BaseRateChangeAmount 
        }) 
    .GroupBy(x => new { 
         CoverageDate = x.CoveragePeriod, 
         Paid = x.PaidDate, 
         Rate = x.TotalCharge, 
         Reimburse = x.Reimbursement 
         }) 
    .GroupBy(x => new { 
         Coverage = x.Key.CoverageDate, 
         DhsRate = x.Sum(y => y.TotalCharge), 
         ReimbursementTotal = x.Sum(y => y.Reimbursement), 
         Adjustments = x.Sum(y => y.Adjust) 
         }) 
    .Select(x => new { 
         CapMonthYear = x.Key.Coverage, 
         DhsRate = x.Key.DhsRate, 
         TotalReimbursement = x.Key.ReimbursementTotal, 
         AdjustmentsTotal = x.Key.Adjustments 
        }); 

我应该说我得到它的工作,但我觉得这是相当cludgey和定期LINQ和lambda表达式的组合,我宁愿这一切与lambda表达式,如果在所有可能的代码。这里是我得到的代码工作:

var rawCapitationData = from capitation 
         in db.HsdMonthlyCapitations 
         where capitation.MemberID == memberID 
         group capitation by new 
          { 
           capitation.CoveragePeriodBeginDate, 
           capitation.TotalClaimCharge, 
           capitation.ReimbursementAmount, 
           capitation.PaidDate 
          } into cap 
         select new { 
             CapitationMonthYear = cap.Key.CoveragePeriodBeginDate, 
             TotalReimbursement = cap.Key.TotalClaimCharge, 
             DhsCapitationAmount = cap.Key.ReimbursementAmount, 
             PaidDate = cap.Key.PaidDate, 
             DhsAdjustments = cap.Sum(x => x.BaseRateChangeAmount) 
            }; 

var capitationData = rawCapitationData.GroupBy(cap => cap.CapitationMonthYear) 
     .Select(data => new { 
          CapitationDate = data.Key, 
          TotalReimbursement = data.Sum(x => x.TotalReimbursement), 
          DhsCapitationAmount = data.Sum(x => x.DhsCapitationAmount), 
          DhsAdjustments = data.Sum(x => x.DhsAdjustments) 
          }); 

我的首选是在一个声明中这样做。它甚至有可能吗?我觉得我很接近lambda表达式,但我知道我错过了一些东西。

任何帮助或建议,非常感谢。

回答

1

不知道什么是你想实现的,但是我已经结束了与此:

return db.HsdMonthlyCapitations 
    .Where(x => x.MemberID == memberID) 
    .GroupBy(x => new {x.CoveragePeriodBeginDate, x.PaidDate, x.TotalClaimCharge, x.ReimbursementAmount}) 
    .Select(x => new 
    { 
     x.Key.CoveragePeriodBeginDate, 
     x.Key.PaidDate, 
     Rate = x.Key.TotalClaimCharge, 
     TotalReimbursement = x.Key.ReimbursementAmount, 
     Adjustments = x.Sum(m => m.BaseRateChangeAmount) 
    }) 
    .GroupBy(x => x.CoveragePeriodBeginDate) 
    .Select(x => new 
    { 
     CoveragePeriodBeginDate = x.Key, 
     RateTotal = x.Sum(m => m.Rate), 
     ReimbursementTotal = x.Sum(m => m.TotalReimbursement), 
     AdjustmentsTotal = x.Sum(m => m.Adjustments), 
    }) 
    .OrderBy(x => x.CoveragePeriodBeginDate); 
+0

这工作。谢谢。现在,我有另外一个问题,这并不重要,但这种嵌套是否正常?我也想过在数据库中创建一个可以消除子查询需求的视图。然后我只需要组一次。这会是更好的方式吗? –

+0

@ChrisF。如果性能不是优先级,则在LINQ中嵌套是很好的,因为ORM可能会生成次优SQL代码,所以如果您的查询很复杂,最好由您自己编写SQL(存储过程)。尽管如此,你应该基准它。 – Szer