从 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
的总和,其中特定的 ItemCode
与 dtItemStock
项目代码匹配。
然后将上面的总和减去dtItemStock
s 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();
调试器的输出:
我有以下数据网格,如下图所示。
我在 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
的总和,其中特定的 ItemCode
与 dtItemStock
项目代码匹配。
然后将上面的总和减去dtItemStock
s 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();
调试器的输出: