2012-01-08 95 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