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

多个表使用linq sql对列的总和进行分组和减法,linq,Linq,这里有两张桌子 表一 +---------------+----------+------------+ | Raw Material | Size | Qty | +---------------+----------+------------+ | A | 1 | 5 | | A | 2 | 2 | | A | 1 |

这里有两张桌子

表一

+---------------+----------+------------+
| 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         |
+---------------+----------+------------+

想通过分组原材料和尺寸来减去前两个表的数量之和

类似的方法应该可以完成这项工作

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
,只需将最终的匿名类型投影(
new{…}
)替换为
newyourtableelementtype{…}

我认为没有直接的方法可以为这项工作编写代码……您可以在两个表上进行分组,然后您需要为减法部分编写cutom逻辑…@Pranay Rana好的,我试过了,但如何在分组后获得原材料和尺寸table@AndreaDusza是的我弄错了对不起你可以在我的回答中检查分组查询等一下,你们想要点什么。所以,为什么不这样做呢?这是一个非常优雅的解决方案,使用因子可以避免进行减法和加法。我正要发布另一个更复杂的解决方案,但我的情况就到此为止了。