【发布时间】:2018-06-24 12:15:40
【问题描述】:
我有两个数据表,它们都具有相同类型的架构但具有不同的数据。基本上,我想做的是我想减去那些小于 newDt1 的 newDt 行。 到目前为止,我编写了该代码,但它有一些逻辑错误。
下面是一个包含原始数据的newDt 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();
下面是生成的 DataTable,其中包含从 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();
}
}
我希望只减去 'newDT1' 的那些 'qty' 列行,它们小于 'newDT' 的 'qty' 列的行值。
【问题讨论】:
-
行["qty"] = (Convert.ToInt32(r.D2["qty"]) > Convert.ToInt32(r.D1["qty"])) ? Convert.ToInt32(r.D2["qty"]) - Convert.ToInt32(r.D1["qty"]) : Convert.ToInt32(r.D2["qty"];