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

VB.NET中Dapper+LINQ多表合并去重排序的实现问题求助

VB.NET Dapper+LINQ多表联合合并汇总问题排查与修正

问题核心

你的代码未按ITEM字段执行分组汇总逻辑,仅依赖默认的整条记录去重(基于实体全字段相等性判断),导致同一ITEM的多条记录无法合并,最终单独显示。

排查与修正方案

1. 典型错误代码示例(匹配你的场景)

如果你的代码类似下面这样,问题就出在Union的去重逻辑和缺少分组汇总:

Public Class StockItem
    Public Property ITEM As String
    Public Property QTY As Integer
    Public Property WH As String
End Class

Using conn As New SqlConnection("你的连接字符串")
    Dim sqlIn = "SELECT ITEM, QTY, WH FROM StockIn"
    Dim sqlOut = "SELECT ITEM, QTY, WH FROM StockOut"
    
    Dim listIn = conn.Query(Of StockItem)(sqlIn).ToList()
    Dim listOut = conn.Query(Of StockItem)(sqlOut).ToList()
    
    ' 错误点:Union按全字段去重,未按ITEM分组汇总
    Dim result = listIn.Union(listOut).OrderBy(Function(x) x.ITEM).ToList()
End Using

2. 修正后的代码(LINQ分组汇总)

核心是先合并所有数据,再按ITEM分组聚合数值字段,最后排序:

Public Class StockItem
    Public Property ITEM As String
    Public Property QTY As Integer
    Public Property WH As String
End Class

Using conn As New SqlConnection("你的连接字符串")
    Dim sqlIn = "SELECT ITEM, QTY, WH FROM StockIn"
    ' 若出库需扣减库存,将QTY转为负数,否则直接保留原QTY
    Dim sqlOut = "SELECT ITEM, -QTY AS QTY, WH FROM StockOut"
    
    ' 合并所有原始记录(用Concat而非Union,避免提前去重)
    Dim allRecords = conn.Query(Of StockItem)(sqlIn).Concat(conn.Query(Of StockItem)(sqlOut)).ToList()
    
    ' 按ITEM分组,汇总QTY,处理WH字段(按需选择取第一个/拼接去重值)
    Dim result = allRecords.GroupBy(Function(x) x.ITEM)
                        .Select(Function(group) New StockItem With {
                            .ITEM = group.Key,
                            .QTY = group.Sum(Function(item) item.QTY),
                            .WH = group.First().WH ' 如需多仓库拼接:String.Join(",", group.Select(Function(x) x.WH).Distinct())
                        })
                        .OrderBy(Function(x) x.ITEM)
                        .ToList()
End Using

3. 关键逻辑说明

  • Concat替代Union:Union会自动过滤全字段重复的记录,而Concat保留所有原始数据,确保分组时能聚合同一ITEM的所有条目。
  • GroupBy分组:这是合并的核心,按ITEM字段将散列记录聚合为分组。
  • 汇总规则:通过Sum处理QTY的累加/扣减,WH字段可根据业务需求选择取首个值、拼接去重值等。

4. 数据库层面优化(大数据量首选)

如果数据量较大,推荐直接在SQL中完成分组汇总,性能更优:

SELECT 
    ITEM, 
    SUM(QTY) AS QTY, 
    WH
FROM (
    SELECT ITEM, QTY, WH FROM StockIn
    UNION ALL
    SELECT ITEM, -QTY AS QTY, WH FROM StockOut
) AS CombinedData
GROUP BY ITEM, WH
ORDER BY ITEM

用Dapper直接查询该SQL即可:

Dim summarySql = "上面的SQL语句"
Dim result = conn.Query(Of StockItem)(summarySql).ToList()

测试验证(匹配你的期望输出)

测试数据

表名ITEMQTYWH
StockInA00110WH1
StockInA0015WH1
StockInA00220WH2
StockOutA0013WH1
StockOutA0025WH2

期望输出

ITEMQTYWH
A00112WH1
A00215WH2

使用修正后的代码或SQL查询,均可得到上述合并汇总结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:55:33