如何基于多列相同值对DataTable执行GroupBy分组并生成结果表?
多列分组实现DataTable分组的正确方法
问题根源
- 空值错误:直接对DataRow列值调用
ToString().Trim()时,若列值为DBNull会抛出异常 - 返回原表:代码最后用
SelectMany将所有分组的行重新合并,等于取消了分组效果
解决代码与步骤
1. 带空值处理的分组逻辑
先处理空值避免异常,再按三列组合值分组:
' 按三列组合分组,兼容空值 Dim groupedRows = in_dt_WPSFileInput.AsEnumerable().GroupBy(Function(r) New With { Key .MedicareNo = If(r.IsNull("PatientMedicareNumber"), "", r("PatientMedicareNumber").ToString().Trim()), Key .ServiceStart = If(r.IsNull("DateofServiceStart"), "", r("DateofServiceStart").ToString().Trim()), Key .ServiceEnd = If(r.IsNull("DateofServiceEnd"), "", r("DateofServiceEnd").ToString().Trim()) })
2. 生成多个分组后的DataTable
遍历每个分组,克隆原表结构并导入分组行:
' 存储所有分组后的DataTable Dim resultTables As New List(Of DataTable)() For Each group In groupedRows ' 复制原表的结构(不含数据) Dim newTable = in_dt_WPSFileInput.Clone() ' 将当前分组的行导入新表 group.CopyToDataTable(newTable, LoadOption.Upsert) resultTables.Add(newTable) Next
代码说明
IsNull方法判断列值是否为DBNull,空值时用空字符串替代,避免转换异常- 匿名类型的
Key关键字确保分组逻辑按三个字段的组合值执行 - 每个分组单独克隆原表结构,保证新表和原表字段完全一致
- 不使用
SelectMany,保留每个分组的独立性,最终resultTables会包含7个分组后的DataTable
内容的提问来源于stack exchange,提问作者Arun Singh G
相关产品推荐
相关产品推荐

