#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")
);
}
}
И теперь у вас есть ваши данные в нормализованном формате, который вы предпочитаете. Опять же, измените соответствующие имена столбцов и типы данных в соответствии с вашими потребностями.