VB.NET中含指定列的DataTable后台代码去重方法咨询
搞定DataTable去重:获取三列组合的唯一值
嘿,我来帮你解决这个DataTable去重的问题!针对你包含HOUSE_BILL_KEY、HOUSE_BILL_SRC_ID、SRC_RCRD_ID三列的DataTable,这里有两种实用的后台代码实现方式,都是基于三列组合唯一来过滤重复项的:
方法1:使用DataView的ToTable方法(兼容.NET Framework)
这是ADO.NET里最经典的去重方式,代码简单且兼容性强,适合传统项目:
// 假设你的原始DataTable名为originalDt DataView dv = new DataView(originalDt); // 调用ToTable,参数分别是:是否去重、要保留的列名数组 DataTable distinctDt = dv.ToTable(true, "HOUSE_BILL_KEY", "HOUSE_BILL_SRC_ID", "SRC_RCRD_ID");
解释一下:true表示开启去重,后面的列名数组指定了用来判断重复的列——只有当这三列的值完全相同时,才会被视为重复项过滤掉。
方法2:使用Linq to DataSet(简洁高效,推荐.NET Core/.NET 5+)
如果你用的是较新的.NET框架,Linq写法会更简洁直观。这里分两种情况:
情况A:使用DistinctBy(.NET Core 3.0+/NET 5+)
DistinctBy可以直接指定去重的键,代码非常清爽:
using System.Linq; using System.Data; // 假设originalDt是你的原始DataTable var distinctRows = originalDt.AsEnumerable() .DistinctBy(row => new { HouseBillKey = row.Field<string>("HOUSE_BILL_KEY"), // 根据实际数据类型调整,比如int HouseBillSrcId = row.Field<string>("HOUSE_BILL_SRC_ID"), SrcRcrdId = row.Field<string>("SRC_RCRD_ID") }); // 将Linq结果转回DataTable DataTable distinctDt = distinctRows.CopyToDataTable();
情况B:兼容旧版.NET(用GroupBy)
如果你的项目是.NET Framework 4.x这类不支持DistinctBy的版本,可以用GroupBy来实现:
using System.Linq; using System.Data; var distinctRows = originalDt.AsEnumerable() .GroupBy(row => new { HouseBillKey = row.Field<string>("HOUSE_BILL_KEY"), HouseBillSrcId = row.Field<string>("HOUSE_BILL_SRC_ID"), SrcRcrdId = row.Field<string>("SRC_RCRD_ID") }) .Select(g => g.First()); // 取每个分组的第一行 DataTable distinctDt = distinctRows.CopyToDataTable();
注意事项
- 记得根据你的实际数据类型调整
Field<T>里的泛型参数,比如如果HOUSE_BILL_KEY是int类型,就写row.Field<int>("HOUSE_BILL_KEY")。 - 如果只需要基于某一列去重(比如只按
HOUSE_BILL_KEY),只需要修改列名数组或者GroupBy的键即可。
内容的提问来源于stack exchange,提问作者user7776356
相关产品推荐
相关产品推荐

