Управлять выборочными строками из двух таблиц данных - PullRequest
0 голосов
/ 24 июня 2018

У меня есть две таблицы данных, оба имеют схему одного типа, но имеют разные данные. По сути, я хочу сделать так, чтобы я вычел те строки 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.

1 Ответ

0 голосов
/ 03 июля 2018

Вот как мы можем вычесть две таблицы данных.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...