У меня есть две таблицы данных, оба имеют схему одного типа, но имеют разные данные. По сути, я хочу сделать так, чтобы я вычел те строки newDt, которые меньше, чем newDt1.
До этого момента я писал этот код, но в нем есть логическая ошибка.
Ниже приведен новый 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, который содержит вычтенное «qty» из newDt из newDt1.
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();
}
}
Я хочу, чтобы вычитались только те строки столбца 'qty' из newDT1, которые меньше значения строки столбца 'qty' из newDT.