多个表使用linq sql对列进行分组并减去列的总和

时间:2016-01-07 12:19:07

标签: linq

这里我有两张桌子

表一

+---------------+----------+------------+
| Raw Material  |  Size    |  Qty       | 
+---------------+----------+------------+
|  A            |  1       |  5         |
|  A            |  2       |  2         |
|  A            |  1       |  2         |
|  B            |  0       |  5         |
|  B            |  0       |  1         |
+---------------+----------+------------+

表二

+---------------+----------+------------+
| Raw Material  |  Size    |  Qty       |
+---------------+----------+------------+
|  A            |  1       |  2         |
|  A            |  2       |  1         |
|  A            |  1       |  1         |
+---------------+----------+------------+

我想要像

一样
+---------------+----------+------------+
| Raw Material  |  Size    |  Qty       |
+---------------+----------+------------+
|  A            |  1       |  4         |
|  A            |  2       |  1         |
|  B            |  0       |  6         |
+---------------+----------+------------+

希望通过分组原材料和尺寸

来减去前两个表数量的总和

1 个答案:

答案 0 :(得分:3)

像这样的事情应该做的工作

var result = tableA.Select(e => new { Item = e, Factor = 1 })
    .Concat(tableB.Select(e => new { Item = e, Factor = -1 }))
    .GroupBy(e => new { e.Item.RawMaterial, e.Item.Size }, (key, elements) => new
    { 
        RawMaterial = key.RawMaterial,
        Size = key.Size,
        Qty = elements.Sum(e => e.Item.Qty * e.Factor)
    }).ToList();

首先,我们使用Concat创建两个表的并集,包括一个是加法的信息(在Factor字段中),然后只进行正常的分组。

如果您希望结果为List<YourTableElementType>,只需将最终的匿名类型投影(new { ... })替换为new YourTableElementType { ... }