我正在编写一个使用LINQ连接两个DataTable的函数,问题是我不知道这两个表包含哪些列,除了表将连接的列。
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”。感谢。
答案 0 :(得分:1)
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();