You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"))
             }

关键说明

  1. 使用AsEnumerable()将DataTable转换为LINQ可查询的枚举集合
  2. Join方法完成两表关联,投影匿名类型保留统计所需字段
  3. GroupBy按JobType分组后,通过Select(...).Distinct().Count()实现去重计数,Sum()实现数值求和
  4. 若需要将结果转为DataTable,可调用result.CopyToDataTable()(需确保匿名类型属性符合DataTable列要求)

内容的提问来源于stack exchange,提问作者josmond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:53:15