2016-07-06 80 views
1

我正在编写一个使用LINQ连接两个DataTable的函数,问题是我不提前知道这两个表包含的列,除了列加入。在加入两个DataTable时选择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 DataTable,并添加列,但我要如何更新LINQ查询来填充tableJoined与所有可用字段?现在它只知道表中包含的列数,只填充“ID”,“NAME”和“STOCK”。谢谢。

回答

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(); 
+0

非常感谢! – Karl