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

Linq:结合左连接与Group By实现DataTable分组求和

直接基于两个DataTable实现左连接并按code_part分组求和

我懂你想要跳过之前的query1,直接用原始的tabRealisation和tabPrevision完成左连接、按code_part分组并对指定列求和的需求。咱们可以调整LINQ查询的结构,一步到位完成这些操作,不用先构建中间查询。

实现思路

  1. 左连接:用Group Join关联两个表,保留tabRealisation的所有记录,即使tabPrevision里没有匹配项。
  2. 处理空匹配:用DefaultIfEmpty()确保没有匹配的tabPrevision记录时,不会丢失tabRealisation的分组。
  3. 分组求和:按code_part对左连接后的记录分组,分别对两个表的指定列求和,空值用0填充避免计算出错。

完整代码示例

' 直接操作原始DataTable的LINQ查询
Dim groupedSumQuery = From r In tabRealisation.AsEnumerable
                      ' 左连接两个表,关联条件保持和你之前一致
                      Group Join p In tabPrevision.AsEnumerable
                          On r.Field(Of Integer)("code_part") Equals p.Field(Of Integer)("code_part")
                          And r.Field(Of Integer)("CodeTypeBien") Equals p.Field(Of Integer)("CodeTypeBien")
                          And r.Field(Of Integer)("month") Equals p.Field(Of Integer)("month")
                          And r.Field(Of String)("TitreFoncier") Equals p.Field(Of String)("TitreFoncier")
                      Into previsionMatches = Group
                      ' 确保左连接的完整性,没有匹配项时用空值占位
                      From match In previsionMatches.DefaultIfEmpty()
                      ' 按code_part分组,对指定列求和
                      Group By code_part = r.Field(Of Integer)("code_part")
                      Into TotalUniteStock = Sum(If(r.Field(Of Integer?)("UniteStock"), 0)),
                           TotalCAStock = Sum(If(r.Field(Of Double?)("CAStock"), 0.0)),
                           TotalUniteVentePrev = Sum(If(match IsNot Nothing, match.Field(Of Integer?)("UniteVentePrev"), 0))
                      ' 选择最终结果
                      Select New With {
                          .code_part = code_part,
                          .TotalUniteStock = TotalUniteStock,
                          .TotalCAStock = TotalCAStock,
                          .TotalUniteVentePrev = TotalUniteVentePrev
                      }

' 可选:将查询结果转换为DataTable
Dim resultDataTable As New DataTable()
resultDataTable.Columns.Add("code_part", GetType(Integer))
resultDataTable.Columns.Add("TotalUniteStock", GetType(Integer))
resultDataTable.Columns.Add("TotalCAStock", GetType(Double))
resultDataTable.Columns.Add("TotalUniteVentePrev", GetType(Integer))

For Each item In groupedSumQuery
    resultDataTable.Rows.Add(item.code_part, item.TotalUniteStock, item.TotalCAStock, item.TotalUniteVentePrev)
Next

关键细节说明

  • Nullable类型处理:用If(字段, 0)把可能为空的Nullable类型字段转换成默认值0,避免求和时出现NullReferenceException或结果为Nothing。
  • 左连接完整性:DefaultIfEmpty()保证即使tabPrevision中没有匹配当前tabRealisation的记录,也会生成一个空的匹配项,确保tabRealisation的所有分组都被保留。
  • 分组逻辑:先完成左连接再分组,确保所有关联的记录都被纳入求和范围,不会遗漏任何匹配项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:19:48