我正在编写一个使用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
数据表并添加列,以适应tableJoined
的最终结构,但是我如何更新LINQ查询来填充tableJoined
与所有可用的字段?现在,它只通过知道表包含多少列来填充"ID"、"NAME"one_answers"STOCK"。谢谢。
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();