Запрос объекта DataTable с динамическими именами столбцов с применением технологии LINQ
Я предварю этот вопрос сообщением о том, что прочитал сайт MSDN, связанный с LINQ (который ориентирован на использование баз данных с известными именами столбцов, а не наборов данных и таблиц данных в памяти), и потратил, возможно, 20 часов на поиск решения на различных форумах для того, что я должен решить.
У меня есть с# Приложение Winforms, которое будет принимать CSV-файл и загружать данные в datatable. Имена столбцов datatable считываются и заполняются в другой datatable, который служит для сопоставления исходного datatable с нормализованным конечным datatable. Пользователю предоставляется экран, на котором он вводит данные о том, какой исходный столбец соответствует какому целевому столбцу.
Проблема
Как скопировать только столбцы из исходной таблицы, необходимые для целевой таблицы, используя таблицу сопоставления, чтобы сказать, что должно идти куда. В SQL я бы сделал это с помощью динамического SQL, например:
DECLARE @sql nvarchar(4000) -- This creates the dynamic query statement and embeds the concatenated list of source column names (the STUFF function handles the concatenation) mapped to the target columns or puts in an empty string if the column was not mapped to avoid a column count mismatch when inserting SELECT @sql = 'SELECT ' + STUFF((SELECT ',' + ISNULL(m.src,'') FROM tbl_map m FOR XML PATH('')),1,1,'') + ' FROM tbl_src' -- This inserts the records from the source table using the dynamic query into the target table INSERT INTO target_table EXEC(@sql)
Опять же, ничто из того, что я где-либо читал, не касалось использования datatable в качестве источника, где имена столбцов заранее не известны.
Источник Образца:
----------------------------------------------------------------------- | FName | LName | DOB | SSN | Sex | LicNbr | State | | Bob | Smith | 19230105 | 123456789 | M | N4257665 | NJ | | Jane | Doe | 19670530 | 000000000 | F | 12457890 | PA | -----------------------------------------------------------------------
Пример Отображения:
-------------------------- | Target | Source | | first_name | FName | | last_name | LName | | license_state | State | | license_id | LicNbr | --------------------------
Ожидаемый Результат Выборки:
------------------------------------------------------- | first_name | last_name | license_state | license_id | | Bob | Smith | NJ | N4257665 | | Jane | Doe | PA | 12457890 | -------------------------------------------------------
Вот несколько данных/таблиц данных, участвующих:
//Datatable to hold the mapping between the source datatable and the target datatable DataTable dt = new DataTable("dt_map"); //Add columns to the mapping table DataColumn dc = new DataColumn("source", typeof(string)); dc.DefaultValue = string.Empty; dt.Columns.Add(dc); dc = new DataColumn("target", typeof(string)); dc.DefaultValue = string.Empty; dt.Columns.Add(dc); //Load initial row data populating the target table column names to map to dt.BeginLoadData(); dt.Rows.Add("first_name", ""); dt.Rows.Add("last_name", ""); dt.Rows.Add("license_state", ""); dt.Rows.Add("license_id", ""); dt.EndLoadData(); //Add the mapping datatable to the dataset ds_mstr.Tables.Add(dt.Copy()); //Create the final normalized datatable which be used dt = new DataTable("dt_final"); //Add columns to the final datatable dc = new DataColumn("first_name", typeof(string)); dc.DefaultValue = string.Empty; dt.Columns.Add(dc); dc = new DataColumn("last_name", typeof(string)); dc.DefaultValue = string.Empty; dt.Columns.Add(dc); dc = new DataColumn("license_state", typeof(string)); dc.DefaultValue = string.Empty; dt.Columns.Add(dc); dc = new DataColumn("license_id", typeof(string)); dc.DefaultValue = string.Empty; dt.Columns.Add(dc); //Add the final datatable to the dataset ds_mstr.Tables.Add(dt.Copy());
Опять же, имена исходных столбцов неизвестны до тех пор, пока они не будут импортированы из файла и будут различаться по названию и количеству. Предположим, что все рассматривается как строка для простоты. Спасибо тому, кто может предоставить решение/руководство, и еще больше спасибо, если объяснение может прийти вместе с ответом, чтобы я мог чему-то научиться на этом пути и стать лучшим разработчиком для этого!
Что я уже пробовал:
Поиск решений или чего-либо, что может быть где-то близко к тому, что я ищу (запрос LINQ с использованием динамических имен столбцов, сопоставленных между двумя таблицами, используя таблицу, которая сопоставляет имена столбцов между двумя таблицами).
Maciej Los
Ну, а объект "mapping" - это DataTable или словарь?
greenhorn_dev
Это datatable.