操作两个数据表中的选择性行



我有两个数据表,它们都具有相同类型的架构,但具有不同的数据。基本上,我想做的是减去那些小于 newDt1 的 newDt 行。 到目前为止,我编写了该代码,但它有一些逻辑错误。

下面是一个包含原始数据的新Dt DataTable。

var newDt = dt.AsEnumerable()
.GroupBy(r => r.Field<int>("batch_num"))
.Select(g =>
{
var row = dt.NewRow();
row["batch_num"] = g.Key;
row["qty"] = g.Sum(r => Convert.ToInt32(r.Field<int>("qty")));
return row;
}).CopyToDataTable();

下面是 newdt1 数据表,其中包含具有不同"qty"列值但相同"batch_num"的数据。

newDt1 = dt_1.AsEnumerable()
.GroupBy(r => r.Field<int>("batch_num"))
.Select(g =>
{
var row = dt_1.NewRow();
row["batch_num"] = g.Key;
row["qty"] = g.Sum(r => Convert.ToInt32(r.Field<int>("qty")));
return row;
}).CopyToDataTable();

下面是生成的数据表,其中包含从newDt1中减去的newDt的"数量"。

DataTable result = newDt.AsEnumerable() // IT IS SUBTRACTING NEWDt from NewDt1 and storing result in it.
.Join(newDt1.AsEnumerable(), d1 => d1["batch_num"], d2 => d2["batch_num"], (d1, d2) => new { D1 = d1, D2 = d2 })
.Select(r =>
{
var row = newDt1.NewRow();
row["batch_num"] = Convert.ToInt32(r.D1["batch_num"]);
row["qty"] = Convert.ToInt32(r.D2["qty"]) - Convert.ToInt32(r.D1["qty"]);
return row;
}).CopyToDataTable();
for (int i = 0; i < result.Rows.Count; i++)
{
if (Convert.ToInt32(newDt.Rows[i]["qty"]) < (Convert.ToInt32(newDt1.Rows[i]["qty"])))
{
SqlCommand command = new SqlCommand("update batch set sold_qty=sold_qty-@soldqty2, left_qty=left_qty+@soldqty2 where id=@id2", con);
command.Parameters.AddWithValue("@soldqty2", Convert.ToInt32(result.Rows[i]["qty"]));
command.Parameters.AddWithValue("@id2", Convert.ToInt32(result.Rows[i]["batch_num"]));
rexe = command.ExecuteNonQuery();
}
}

我希望只减去那些小于"newDT"的"qty"列的行值的"newDT1"的"数量"列行。

以下是我们如何减去两个数据表的方法。

DataTable Subtraction_result = newDt.AsEnumerable()
.Join(newDt1.AsEnumerable(), d1 => d1["batch_num"], d2 => d2["batch_num"], (d1, d2) => new { D1 = d1, D2 = d2 })
.Select(r =>
{
var row = newDt1.NewRow();
row["batch_num"] = Convert.ToInt32(r.D1["batch_num"]);
row["qty"] = Convert.ToInt32(r.D2["qty"]) - Convert.ToInt32(r.D1["qty"]);
return row;
}).CopyToDataTable();

最新更新