Subhasis Chakraborty Ответов: 1

Слияние datacolumns из массива datatable с данными


У меня есть массив данных,

DataSet ds = // I gather data from a datasource

Я инициализировать DataTable[] от ДС.Таблицы

DataTable[] tableArray = ds.Tables.Cast<DataTable>();

Все эти таблицы содержат одну строку данных

Теперь возможен ли альтернативный подход к тому, что я сделал, - объединить столбцы этих таблиц данных, а также поместить данные в столбцы по мере необходимости ?

Пример Данных

Пусть мой DataSet ds есть 2 таблицы dtA и dtB

Ввод

ДТА

Col1 A
Col2 B

dtB

Кол3 С
Col4 D

Выход

dtMerged

Col1 A
Col2 B
Кол3 С
Col4 D

Что я уже пробовал:

Я запустил простой foreach петля на столбцах и rows чтобы сформировать большую базу данных.
Также,
DataTable bigTable = new DataTable();
Enumerable.Range(0, ds.Tables.Count).ToList().ForEach(i => bigTable.Merge(ds.Tables[i]));

DataTable bigTable2 = bigTable.Clone();
DataRow[] rowCollection = bigTable.Rows.Cast<DataRow>().ToArray();
DataRow newDR = bigTable2.NewRow();
Enumerable.Range(0, bigTable.Columns.Count).ToList().ForEach(j =>
{
    newDR[bigTable.Columns[j].ColumnName] = rowCollection.Select(dr => dr[j].ToString()).Last(s => !string.IsNullOrWhiteSpace(s));
});

Примечание: у меня есть причины, чтобы не выполнять сложные запросы и выборки одного объекта DataTable.

Maciej Los

Извините, но в каждой таблице есть одна строка данных? Почему?
Является ли структура каждой отдельной таблицы одинаковой?
Что вы имеете в виду, говоря "слияние"? Вы хотите создать только одну таблицу и" переместить " в нее все данные (поступающие из существующих таблиц)?
Покажите нам пример данных.

Subhasis Chakraborty

Я добавил пример ввода и вывода.

Maciej Los

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

CHill60

"У меня есть причины не выполнять сложный одиночный запрос и не извлекать единственную базу данных". Они наверняка будут малоизвестны.

Subhasis Chakraborty

У меня нет прав на создание / добавление новых представлений в sql server.

CHill60

Тогда не создавайте представление. Как вы запрашиваете все эти отдельные таблицы?

1 Ответов

Рейтинг:
2

Maciej Los

Ну, одним словом: "слить" в английском языке может означать: соединить, связать, соединить, объединить, смешать, объединить...

Если я вас хорошо понимаю, вы хотите объединить данные, что хорошо известно в языке программирования как присоединиться[^]

var mergedData = from a in tableA.AsEnumerable()
        join b in tableB.AsEnumerable() on a.Field<int>("Key") equals b.Field<int>("ForeignKey")
        select new
       {
           A = a.Field<int>("Key"),
           B = a.Field<string>("FieldB"),
           C = b.Field<int>("ForeignKey"),
           D = b.Field<string>("FieldD")
       };

DataTable bigTable = new DataTable();
bigTable.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("Key", typeof(int)),
		new DataColumn("FieldB", typeof(string)),
		new DataColumn("ForeignKey", typeof(int))
		new DataColumn("FieldD", typeof(string))
	});
bigTable = mergedData.CopyToDataTable();


Для получения более подробной информации, пожалуйста, смотрите:
Операторы соединения (LINQ to DataSet)[^]
Запросы в LINQ to DataSet[^]
Создание DataTable из запроса (LINQ to DataSet)[^]



Если вы хотите объединить таблицы, которые имеют одинаковую структуру, попробуйте сделать это:
//create "merged table" with destination structure
DataTable bigTable = new DataTable();
//all tables have to have the same structure!
bigTable.Columns.AddRange(new DataColumn[]
    {
        new DataColumn("EmpId", typeof(int)),
        new DataColumn("EmployeeName", typeof(string)),
        new DataColumn("DepartmentId", typeof(int))
    });
    //copy data into destination table ("merged table")
foreach(DataTable t in ds.Tables)
{
    foreach(DataRow r in t.Rows)
    {
        bigTable.ImportRow(r);
    }
}


Удачи вам!