从 Datagrid 中减去重复值

Subtraction of repeating values from Datagrid

我有以下数据网格,如下图所示。

我在 Sales Datagrid 中有 3 个具有相同 ItemCode 的相似商品的销售额,其总和为 4。

该特定商品的当前库存为 20。

当我单击验证按钮时,我使用以下查询从当前库存中减去销售额,从而更新交易历史数据网格。

查询:

var changes = (from dr1 in dtItemSales.AsEnumerable()
               from dr2 in dtItemStock.AsEnumerable()
               where dr1.Field<string>("ItemCode") == dr2.Field<string>("ItemCode")
                       select new
                       {
                           Name = dr2.Field<string>("ItemCode"),
                           Remarks = dr2.Field<int>("Qty") - dr1.Field<int>("Quantity")
                       }).Distinct().ToList();


//Updating the Transaction History DataGrid.
dgTransactionHistory.ItemsSource = changes;

My problem here is that when I am subtracting the Sales from Current Stock I am getting 2 records bearing the same ItemCode with 2 different values 19 and 18.

I should be getting only 1 record with the value 16 in this particular case. (20 - 2 - 1 - 1)

如能提供有关此查询的任何帮助,我们将不胜感激。谢谢。

对于您问题中突出显示的项目,结果将是 18 和 19(2 个结果)。为什么? 因为 Stock 有 1 个值为 20 的记录。在 LINQ

的 Where 子句中

当你做库存 - 销售时你得到 3 个差异:

20 - 2、20 -1 和另外 20 - 1(对于 3 次销售)

=> 18, 19, 19

现在最后你有一个不同的 - 这就是为什么抛出一个 19 而你得到 18 和 19 的原因。

为什么不先对 ItemId 上的所有销售分组求和。然后从库存中减去。

I should be getting only 1 record with the value 16 in this particular case. (20 - 2 - 1 - 1)

首先尝试从 dtItemSales 中获取 Quantity 的总和,其中特定的 ItemCodedtItemStock 项目代码匹配。

然后将上面的总和减去dtItemStocks Qty列like

所以你的最终查询看起来像

var changes = (from dr1 in dtItemSales.AsEnumerable()
               from dr2 in dtItemStock.AsEnumerable()
               where dr1.Field<string>("ItemCode") == dr2.Field<string>("ItemCode")
               let sum = dtItemSales.AsEnumerable().Where(x => x.Field<string>("ItemCode") == dr2.Field<string>("ItemCode")).Sum(dr => dr.Field<int>("Quantity"))
               select new
               {
                   Name = dr2.Field<string>("ItemCode"),
                   Remarks = dr2.Field<int>("Qty") - sum
               }).GroupBy(x => x.Name).Select(x => x.First()).ToList();

调试器的输出: