C# Linq分组:按维度获取可转Int的RefNo列最小/最大值
解决方案:分组统计时过滤无效RefNo并获取最小/最大有效值
原始数据
| Date | RefNo | MasterName | Value | Type |
|---|---|---|---|---|
| 01-01-2020 | 45 | ABC Pty Ltd | 123.45 | Sales |
| 01-01-2020 | 2 | XYZ Ltd | 134.5 | Sales |
| 01-01-2020 | 46 | ABC Pty Ltd | 765 | Sales |
| 01-01-2020 | 47 | ABC Pty Ltd | 465.4 | Sales |
| 01-01-2020 | 3 | XYZ Ltd | 468 | Sales |
| 01-01-2020 | S_1 | ABC Pty Ltd | 678 | Sales |
| 01-01-2020 | S_2 | XYZ Ltd | 68 | Sales |
你的现有查询代码
var query = data.GroupBy(row => new { row.Date, row.MasterName, row.Type }) .Select(grp => new MasterAccount { Date = grp.Key.Date, Name = grp.Key.MasterName, Type = grp.Key.Type, Amount = grp.Sum(c => c.Value), MinRef = // 获取最小RefNo(类型:int) MaxRef = // 获取最大RefNo(类型:int) });
修改后的完整查询代码
核心思路是先在分组内筛选出可转换为int的有效RefNo,再对这些有效值取最小/最大值,用int.TryParse避免转换异常:
var query = data.GroupBy(row => new { row.Date, row.MasterName, row.Type }) .Select(grp => { // 筛选并转换所有有效的RefNo为int类型 var validRefNumbers = grp .Where(row => int.TryParse(row.RefNo, out _)) // 只保留能转成int的记录 .Select(row => int.Parse(row.RefNo)); // 这里转换是安全的,因为已经过滤过 return new MasterAccount { Date = grp.Key.Date, Name = grp.Key.MasterName, Type = grp.Key.Type, Amount = grp.Sum(c => c.Value), // 有有效值则取最小/最大,否则返回默认值(根据你的需求调整) MinRef = validRefNumbers.Any() ? validRefNumbers.Min() : 0, MaxRef = validRefNumbers.Any() ? validRefNumbers.Max() : 0 }; });
额外优化建议
如果你的MasterAccount类中MinRef和MaxRef允许为null(即定义为int?类型),可以把默认值改成null,这样更能准确表示“无有效RefNo”的情况:
MinRef = validRefNumbers.Any() ? validRefNumbers.Min() : (int?)null, MaxRef = validRefNumbers.Any() ? validRefNumbers.Max() : (int?)null
这样处理后,ABC Pty Ltd分组的MinRef会是45,MaxRef会是47;XYZ Ltd分组的MinRef是2,MaxRef是3,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Bandook
相关产品推荐
相关产品推荐

