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()
测试验证(匹配你的期望输出)
测试数据
| 表名 | ITEM | QTY | WH |
|---|---|---|---|
| StockIn | A001 | 10 | WH1 |
| StockIn | A001 | 5 | WH1 |
| StockIn | A002 | 20 | WH2 |
| StockOut | A001 | 3 | WH1 |
| StockOut | A002 | 5 | WH2 |
期望输出
| ITEM | QTY | WH |
|---|---|---|
| A001 | 12 | WH1 |
| A002 | 15 | WH2 |
使用修正后的代码或SQL查询,均可得到上述合并汇总结果。
内容的提问来源于stack exchange,提问作者user22579796
相关产品推荐
相关产品推荐

