You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套foreach循环时如何跳过SQL GROUP BY语句中包含的Ordrenummer列

解决方案

方案1:修正SQL查询(推荐,性能最优)

你当前SQL查询的问题根源是GROUP BY子句加入了唯一标识列[Ordrenummer],相当于没有做聚合,返回的全是原始明细行。直接调整SQL即可从数据源层面得到预期结果:

  1. 从GROUP BY中移除[Ordrenummer]
  2. 对需要聚合的业务字段(比如开票总金额、行程数等)添加对应聚合函数
    示例SQL:
SELECT 
    [KjøretøyID] AS 车辆标识,
    [LøyvehaverID] AS 企业标识,
    SUM(金额列) AS 总金额, -- 替换为你实际需要聚合的数值字段
    COUNT(1) AS 关联行程数 -- 其他聚合逻辑按需补充
FROM 你的表名
-- 原有WHERE等条件保留
GROUP BY [KjøretøyID], [LøyvehaverID]

调整后查询返回的结果本身就是每个企业+车辆组合对应的聚合行,每个LøyvehaverID下只有2-10条数据,C#侧直接遍历即可,不需要额外处理。

方案2:C#侧做聚合运算(适用于无法修改SQL的场景)

如果不能调整SQL查询,就在现有分组逻辑中对车辆分组内的明细做聚合,不需要遍历单条PaidTrip明细:
修改后的C#代码示例:

IEnumerable<IGrouping<String, PaidTrip>> tripsGroupedByCompany = paidTrips.GroupBy(pt => pt.LicenseHolderID);

foreach (IGrouping<String, PaidTrip> companyGroup in tripsGroupedByCompany) {
    // 原有企业维度业务代码保留

    var groupedByVehicle = companyGroup.GroupBy(t => t.VehicleID);
    
    foreach (IGrouping<String, PaidTrip> vehicleGroup in groupedByVehicle) {
        // 原有车辆维度业务代码保留

        // 对当前车辆分组内的所有明细做聚合,得到单条聚合行
        var invoiceAggregate = new {
            企业ID = companyGroup.Key,
            车辆ID = vehicleGroup.Key,
            总金额 = vehicleGroup.Sum(t => t.应付金额), // 替换为你实际的业务字段和聚合逻辑
            行程数量 = vehicleGroup.Count(),
            最早行程时间 = vehicleGroup.Min(t => t.行程时间),
            // 其他开票需要的字段按需补充聚合逻辑
        };

        // 直接使用invoiceAggregate处理开票逻辑即可,每个车辆分组仅对应1条聚合行,不会出现数百条明细
    }
}

注意:你需要根据实际开票要求,为每个业务字段匹配对应的聚合规则(求和、计数、取最大/最小值等)。


内容的提问来源于stack exchange,提问作者Ole M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:36:03