如何用LINQ合并3个表并添加另外两表的求和列?
解决方法
首先纠正你现有代码里的错误:on c.Cod equals b.Cod 中的 c 应该改为 a,因为这里是关联Tab1的a和Tab2的b。
要同时加入Tab3的Qty求和,最稳妥且高效的方式是先分别对Tab2和Tab3按Cod分组计算求和值,再与Tab1做左连接,避免直接关联多个表导致的笛卡尔积重复计算问题。具体实现如下:
// 预先计算Tab2中每个Cod对应的Qty2总和 var tab2Sum = Tab2 .GroupBy(b => b.Cod) .Select(g => new { Cod = g.Key, Qty2Total = g.Sum(x => x.Qty2) }); // 预先计算Tab3中每个Cod对应的Qty3总和 var tab3Sum = Tab3 .GroupBy(c => c.Cod) .Select(g => new { Cod = g.Key, Qty3Total = g.Sum(y => y.Qty3) }); // 将Tab1与两个求和结果左连接,确保Tab1的所有记录都保留 var query = from a in Tab1 // 左连接Tab2的求和结果 join t2 in tab2Sum on a.Cod equals t2.Cod into t2Group from t2 in t2Group.DefaultIfEmpty() // 左连接Tab3的求和结果 join t3 in tab3Sum on a.Cod equals t3.Cod into t3Group from t3 in t3Group.DefaultIfEmpty() select new { a.Cod, a.Qty1, Orders = t2?.Qty2Total ?? 0, // 若没有匹配记录,默认求和为0 Orders2 = t3?.Qty3Total ?? 0 };
为什么不直接在原查询中加入Tab3连接?
如果直接在原查询里关联Tab3,会导致Tab2和Tab3的记录形成笛卡尔积(比如同一Cod下Tab2有2条、Tab3有3条记录,关联后会生成6条组合记录),最终求和结果会被重复计算,无法得到正确的单表求和值。预先分组求和再连接的方式可以避免这个问题,同时提升查询性能。
内容的提问来源于stack exchange,提问作者Albepisti
相关产品推荐
相关产品推荐

