2016-07-06 78 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