Linq:结合左连接与Group By实现DataTable分组求和
直接基于两个DataTable实现左连接并按code_part分组求和
我懂你想要跳过之前的query1,直接用原始的tabRealisation和tabPrevision完成左连接、按code_part分组并对指定列求和的需求。咱们可以调整LINQ查询的结构,一步到位完成这些操作,不用先构建中间查询。
实现思路
- 左连接:用
Group Join关联两个表,保留tabRealisation的所有记录,即使tabPrevision里没有匹配项。 - 处理空匹配:用
DefaultIfEmpty()确保没有匹配的tabPrevision记录时,不会丢失tabRealisation的分组。 - 分组求和:按
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
相关产品推荐
相关产品推荐

