嵌套foreach循环时如何跳过SQL GROUP BY语句中包含的Ordrenummer列
解决方案
方案1:修正SQL查询(推荐,性能最优)
你当前SQL查询的问题根源是GROUP BY子句加入了唯一标识列[Ordrenummer],相当于没有做聚合,返回的全是原始明细行。直接调整SQL即可从数据源层面得到预期结果:
- 从
GROUP BY中移除[Ordrenummer] - 对需要聚合的业务字段(比如开票总金额、行程数等)添加对应聚合函数
示例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
相关产品推荐
相关产品推荐

