【问题标题】:C# Linq nested GroupBy and SumC# Linq 嵌套 GroupBy 和 Sum
【发布时间】:2016-06-17 05:38:23
【问题描述】:

我正在尝试翻译我在过去几天写给 Linq 的查询,但我似乎无法让它工作。这是我要翻译的查询:

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

我应该说我已经让它工作了,但我觉得它相当笨拙并且混合了常规的 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 表达式,但我知道我错过了一些东西。

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

【问题讨论】:

    标签: c# linq 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);
    

    【讨论】:

    • 那行得通。谢谢你。现在,我还有另一个问题,这并不是那么重要,但是这种嵌套正常吗?我还考虑在数据库中创建一个视图,以消除对子查询的需求。然后我只需要分组一次。那会是更好的方法吗?
    • @ChrisF。如果性能不是优先级,则在 LINQ 中嵌套很好,因为 ORM 可能会生成次优的 SQL 代码,因此如果您的查询很复杂,最好自己编写 SQL(存储过程)。不过,您应该先对其进行基准测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    相关资源
    最近更新 更多