2012-01-08 1 views
0

ASP.NET с использованием C# .NET; .NET3.5Слияние двух таблиц данных в единый DataTable с использованием LINQ, C#

Я два DataTables, как показано ниже:

DataTable1:

Location Visa_Q1  Visa_Q2 
Blore  25   40 
Hyd  40   60 

DataTable2:

Location Visa_Q3  Visa_Q4 
Blore  50   35 
Hyd  80   90 

Как совместить оба DataTables для получения выведите в качестве DataTable, как показано ниже, с помощью LINQ (без цикла каждой строки):

CombinedDataTable:

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

EDIT:

Только путем объединения двух таблиц на основе сопоставления 'Location' я хочу результирующие данные в комбинированной форме. Я не хочу, чтобы выбрать каждое поле столбца вручную select new { .... };

+0

Ваши требования говорят, что петли запрещены? – Marc

+0

Мы должны использовать как можно меньше петель из-за требования к форме. Так мне нужно с LINQ – venkat

+0

Откуда вы берете 'DataTables'? Вам нужно будет изменить этот код, если вы хотите избежать цикла. LINQ to Objects просто использует петли внутри. – Douglas

ответ

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

+0

Просто соединяя две таблицы на основе соответствия «Местоположение», я хочу получить результирующие данные в комбинированной форме. Я не хочу выбирать каждое поле столбца вручную, как вы упомянули выше, в 'select new {....};' – venkat

+0

Я не знаю ни одного метода Linq для этого, поэтому, я думаю, вам нужно добавить некоторые логики в новой статье, чтобы сделать комбинирование вещей, как предлагает @HarisHasan. –

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

+0

Просто соединяя две таблицы на основе соответствия «Местоположение», я хочу получить результирующие данные в комбинированной форме. Я не хочу выбирать каждое поле столбца вручную, как вы упомянули выше, в 'select new {....};' – venkat

+0

см. Обновленный ответ –

Смежные вопросы