2012-01-08 94 views
0

使用C#.NET的ASP.NET; .NET3.5使用LINQ將兩個DataTables合併爲單個DataTable,C#

我有如下兩個DataTable:

DataTable1

Location Visa_Q1  Visa_Q2 
Blore  25   40 
Hyd  40   60 

DataTable2

Location Visa_Q3  Visa_Q4 
Blore  50   35 
Hyd  80   90 

如何既爲數據表得到結合使用LINQ(不循環每行)按如下所示輸出爲DataTable:

CombinedDataTable

Location Visa_Q1  Visa_Q2 Visa_Q3 Visa_Q4 
Blore  25   40  50   35 
Hyd  40   60  80   90 

EDIT

只是通過加入基於匹配 '位置' 我想以組合形式所得到的數據的兩個表。我不想手動選擇每列字段作爲select new { .... };

+0

你的要求是否說循環被禁止? – Marc 2012-01-08 13:23:12

+0

由於性能要求,我們始終儘可能使用循環。所以我需要LINQ – venkat 2012-01-08 13:25:02

+0

你從哪裏得到'DataTables'?如果您想避免循環,您需要修改該代碼--LINQ to Objects僅在內部使用循環。 – Douglas 2012-01-08 16:08:53

回答

0

我相信你可以做這樣的事情:

IEnumerable<DataRow> res = 
    from d1 in DataTable1.AsEnumerable() 
    join d2 in DataTable2.AsEnumerable() on d1["Location"] equals d2["Location"] 
    select new DataRow 
    { 
     d1["Location"], 
     d1["Visa_Q1"], 
     d1["Visa_Q2"], 
     d2["Visa_Q3"], 
     d2["Visa_Q4"] 
    }; 

DataTable CombinedDataTable = res.CopyToDataTable<DataRow>(); 
+0

我怎樣才能得到上述結果組合的DataTable沒有選擇像Visa_Q1,Q2 ...等手動個別列字段 – venkat 2012-01-08 13:13:13

+0

只需通過基於匹配'位置'加入兩個表,我想結合形式的結果數據。我不想手動選擇每個列字段,正如你在'select new {....};' – venkat 2012-01-08 13:14:53

+0

中所提到的那樣,我不知道任何Linq方式這樣做,所以我想你必須添加一些新條款中的邏輯來完成組合內容,如@HarisHasan所暗示的。 – 2012-01-08 13:42:35

2

試試這個

var results = from table1 in dt1.AsEnumerable() 
       join table2 in dt2.AsEnumerable() on table1["Location"] equals table2["Location"] 
       select new 
        { 
         Location = table1["Location"], 
         Visa_Q1 = (int)table1["Visa_Q1"], 
         Visa_Q2 = (int)table1["Visa_Q2"], 
         Visa_Q3 = (int)table2["Visa_Q3"], 
         Visa_Q4 = (int)table2["Visa_Q4"], 
        }; 

編輯

試這用於選擇所有列

DataTable table = new DataTable(); 
     foreach (DataColumn column in t1.Columns) 
     { 
      table.Columns.Add(column.ColumnName, column.DataType); 
     } 

     foreach (DataColumn column in t2.Columns) 
     { 
      if (column.ColumnName == "Location") 
       table.Columns.Add(column.ColumnName + "2", column.DataType); 
      else 
       table.Columns.Add(column.ColumnName, column.DataType); 
     } 

     var results = t1.AsEnumerable().Join(t2.AsEnumerable(), 
       a => a.Field<String>("Location"), 
       b => b.Field<String>("Location"), 
       (a, b) => 
       { 
        DataRow row = table.NewRow(); 
        row.ItemArray = a.ItemArray.Concat(b.ItemArray).ToArray(); 
        table.Rows.Add(row); 
        return row; 
       }); 
+0

如果有'n'沒有動態的列(不是靜態的)。我是否需要手動選擇每個表中的每個列字段?我如何在這種情況下得到結果 – venkat 2012-01-08 13:11:06

+0

只需通過基於匹配的「位置」連接兩個表,我就想要以組合形式得到的數據。我不想手動選擇每個列字段,如上面在'select new {....}中提到的那樣;' – venkat 2012-01-08 13:15:39

+0

查看更新的答案 – 2012-01-08 13:20:38