Синтаксический анализ данных из плоской таблицы в таблицу normailze

#c# #.net #linq-to-sql #ado.net #dataset

#c# #.net #linq-to-sql #ado.net #набор данных

Вопрос:

У меня есть требование для интеграции в B2B, я буду считывать плоскую таблицу из dataset и анализировать до нормализованной формы datatable.

У меня будут столбцы для сбора данных в образце данных datatable

 Invoice num     Amount    LineNum   Line Amout  Ledger
INV1            100       1         50          11101
INV1            100       2         50          25631 
  

строки будут повторяться с разными счетами

Как можно четко выбрать новую datatable? использование ADO.NET

Я хочу проанализировать данные в следующем формате

Таблица заголовков

   Invoice num     Amount    
  INV1            100         
  

Таблица строк

   Invoice num  LineNum   Line Amout  Ledger
  INV1          1         50          11101
  INV1          2         50          25631 
  

ВОПРОС: Я не знаю, какой был бы лучший способ привести вышеуказанный формат? Я вижу примеры использования linq, DataTable, Views? Я ищу фрагмент кода.

Ответ №1:

Хорошо, чтобы начать проблему, я работаю с DataTable и данными, определенными следующим образом. Измените имена и типы в соответствии с вашими потребностями.

 // I am building this table in code just for the purposes of this answer.
// If you already have your data table, ignore!
DataTable salesTable = new DataTable();
salesTable.Columns.Add("InvoiceNum", typeof(string));
salesTable.Columns.Add("Amount", typeof(decimal));
salesTable.Columns.Add("LineNum", typeof(int));
salesTable.Columns.Add("LineAmount", typeof(decimal));
salesTable.Columns.Add("Ledger", typeof(string));

// This is also just to populate data for the sample.
// Omit as you already have your data.
salesTable.Rows.Add("INV1", 100M, 1, 50M, "11101");
salesTable.Rows.Add("INV1", 100M, 1, 50M, "25631");
  

Обратите внимание, что я использую перегрузку, .Rows.Add которая принимает params object[] массив. Значения, которые я передаю, указаны в порядке и типе столбцов, которые они должны заполнять. Приведенный ниже код использует тот же подход.

Первое, что я хочу сделать, это определить таблицы для вашего нового нормализованного формата. Сначала таблица заголовков.

 DataTable headerTable = new DataTable();
headerTable.Columns.Add("InvoiceNum", typeof(string));
headerTable.Columns.Add("Amount", typeof(decimal));
  

А затем таблица позиций.

 DataTable lineTable = new DataTable();
lineTable.Columns.Add("InvoiceNum", typeof(string));
lineTable.Columns.Add("LineNum", typeof(int));
lineTable.Columns.Add("LineAmount", typeof(decimal));
lineTable.Columns.Add("Ledger", typeof(string));
  

После этого я собираюсь использовать LINQ для группировки исходной таблицы продаж на основе номера счета.

 var groupedData = from row in salesTable.AsEnumerable()
                  group row by row.Field<string>("InvoiceNum") into grp
                  select grp;
  

После этого остается только перебирать группы и добавлять данные в новые таблицы.

 foreach (var invoiceGroup in groupedData)
{
    string invoiceNumber = invoiceGroup.Key;
    decimal amount = invoiceGroup.First().Field<decimal>("Amount");

    headerTable.Rows.Add(invoiceNumber, amount);

    foreach (DataRow row in invoiceGroup)
    {
        lineTable.Rows.Add(
                invoiceNumber,
                row.Field<int>("LineNum"),
                row.Field<decimal>("LineAmount"),
                row.Field<string>("Ledger")
            );
    }
}
  

И теперь у вас есть ваши данные в нормализованном формате, который вы предпочитаете. Опять же, измените соответствующие имена столбцов и типы данных в соответствии с вашими потребностями.