Выберите все доступные поля в запросе LINQ при объединении двух таблиц данных

63
6

Я пишу функцию, которая объединяет два DataTables с использованием LINQ, проблема в том, что я заранее не знаю, какие столбцы содержат две таблицы, кроме столбцов, к которым будут привязаны таблицы.

string id = "ID";    
DataTable tableJoined = new DataTable();
tableJoined.Columns.Add(id, typeof(string));
tableJoined.Columns.Add("NAME", typeof(string));
tableJoined.Columns.Add("STOCK", typeof(string));

var result = from dataRows1 in table1.AsEnumerable()
join dataRows2 in table2.AsEnumerable()
on dataRows1.Field<string>(id) equals dataRows2.Field<string>(id)
select tableJoined.LoadDataRow(new object[]
{
dataRows1.Field<string>(id),
dataRows1.Field<string>(1),
dataRows2.Field<string>(1)
}, false);
result.CopyToDataTable();

Я могу построить tableJoined DataTable и добавить столбцы в пути, чтобы разместить окончательную структуру tableJoined, но как мне обновить запрос LINQ, чтобы заполнить tableJoined всеми доступными полями? Сейчас он заполняет только "ID", "NAME" и "STOCK", зная, сколько столбцов содержит таблицы. Благодарю.

спросил(а) 2021-01-25T18:57:06+03:00 4 месяца, 3 недели назад
1
Решение
64

var tableJoined = table1.Clone(); // create columns from table1

// add columns from table2 except id
foreach (DataColumn column in table2.Columns)
{
if (column.ColumnName != id)
tableJoined.Columns.Add(column.ColumnName, column.DataType);
}

tableJoined.BeginLoadData();

foreach (DataRow row1 in table1.Rows)
{
foreach (DataRow row2 in table2.Rows)
{
if (row1.Field<string>(id) == row2.Field<string>(id))
{
var list = row1.ItemArray.ToList(); // items from table1

// add items from table2 except id
foreach (DataColumn column in table2.Columns)
if (column.ColumnName != id)
list.Add(row2[column]);

tableJoined.Rows.Add(list.ToArray());
}
}
}

tableJoined.EndLoadData();

ответил(а) 2021-01-25T18:57:06+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема