VB.NET中用LINQ实现DataTable关联分组及去重计数
VB.NET LINQ 实现多DataTable关联分组、去重统计与求和
参考SQL实现
SELECT t1.JobType, COUNT(DISTINCT t1.Table1Id) AS UniqueTable1IdCount, COUNT(DISTINCT t2.Table2Id) AS UniqueTable2IdCount, SUM(t2.JobValue) AS TotalJobValue FROM Table1 t1 INNER JOIN Table2 t2 ON t1.Table1Id = t2.Table1Id GROUP BY t1.JobType
常见错误点
多数问题出在未对ID做去重处理就直接计数,或是分组时没有正确保留关联后的字段信息,导致统计结果不符合预期。
正确VB.NET LINQ实现
方法链风格
' 替换dtTable1、dtTable2为你的实际DataTable对象,字段名和类型按需调整 Dim result = dtTable1.AsEnumerable() .Join(dtTable2.AsEnumerable(), Function(t1) t1.Field(Of Integer)("Table1Id"), ' 关联键:Table1的Table1Id Function(t2) t2.Field(Of Integer)("Table1Id"), ' 关联键:Table2的Table1Id Function(t1, t2) New With { .JobType = t1.Field(Of String)("JobType"), .Table1Id = t1.Field(Of Integer)("Table1Id"), .Table2Id = t2.Field(Of Integer)("Table2Id"), .JobValue = t2.Field(Of Decimal)("JobValue") }) .GroupBy(Function(x) x.JobType) ' 按JobType分组 .Select(Function(g) New With { .JobType = g.Key, ' 对分组内的Table1Id去重后计数 .UniqueTable1IdCount = g.Select(Function(item) item.Table1Id).Distinct().Count(), ' 对分组内的Table2Id去重后计数 .UniqueTable2IdCount = g.Select(Function(item) item.Table2Id).Distinct().Count(), ' 对分组内的JobValue求和 .TotalJobValue = g.Sum(Function(item) item.JobValue) })
查询表达式风格
Dim result = From t1 In dtTable1.AsEnumerable() Join t2 In dtTable2.AsEnumerable() On t1.Field(Of Integer)("Table1Id") Equals t2.Field(Of Integer)("Table1Id") Group By JobType = t1.Field(Of String)("JobType") Into Group Select New With { .JobType = JobType, .UniqueTable1IdCount = Group.Select(Function(item) item.t1.Field(Of Integer)("Table1Id")).Distinct().Count(), .UniqueTable2IdCount = Group.Select(Function(item) item.t2.Field(Of Integer)("Table2Id")).Distinct().Count(), .TotalJobValue = Group.Sum(Function(item) item.t2.Field(Of Decimal)("JobValue")) }
关键说明
- 使用
AsEnumerable()将DataTable转换为LINQ可查询的枚举集合 Join方法完成两表关联,投影匿名类型保留统计所需字段GroupBy按JobType分组后,通过Select(...).Distinct().Count()实现去重计数,Sum()实现数值求和- 若需要将结果转为DataTable,可调用
result.CopyToDataTable()(需确保匿名类型属性符合DataTable列要求)
内容的提问来源于stack exchange,提问作者josmond
相关产品推荐
相关产品推荐

