2013-06-06 2 views
0

у меня есть два DataTable массивыобъединить два DataTable массивов C#

DataTable[] DTrightSplitH2; 
    DataTable[] DTleftSplitH2; 

то, что я пытаюсь сделать, это принять каждый DataTable в DTright и сравните DTleft в «ключевых» столбцах это они же, слить ряд

я знаю, что я должен использовать DataTable.Merge с множеством BOOL лжи и добавление отсутствующих схем, но я не могу заставить его работать, как я хочу

ответ

0

Попробуйте это:

DTrightSplitH2.Union(DTleftSplitH2); 
+0

но как установить они ключ для объединения? – iakovl2

0

Звучит так, как если бы вы использовали мой метод MergeAll (использование ниже).

public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn) 
{ 
    if (!tables.Any()) 
     throw new ArgumentException("Tables must not be empty", "tables"); 
    if(primaryKeyColumn != null) 
     foreach(DataTable t in tables) 
      if(!t.Columns.Contains(primaryKeyColumn)) 
       throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn"); 

    if(tables.Count == 1) 
     return tables[0]; 

    DataTable table = new DataTable("TblUnion"); 
    table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data 
    foreach (DataTable t in tables) 
    { 
     foreach (DataColumn col in t.Columns) 
      col.ReadOnly = false; // required e.g. if you use a DataSet with Foreign-Key Constraints 
     table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add); 
    } 
    table.EndLoadData(); 

    if (primaryKeyColumn != null) 
    { 
     // since we might have no real primary keys defined, the rows now might have repeating fields 
     // so now we're going to "join" these rows ... 
     var pkGroups = table.AsEnumerable() 
      .GroupBy(r => r[primaryKeyColumn]); 
     var dupGroups = pkGroups.Where(g => g.Count() > 1); 
     foreach (var grpDup in dupGroups) 
     { 
      // use first row and modify it 
      DataRow firstRow = grpDup.First(); 
      foreach (DataColumn c in table.Columns) 
      { 
       if (firstRow.IsNull(c)) 
       { 
        DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c)); 
        if (firstNotNullRow != null) 
         firstRow[c] = firstNotNullRow[c]; 
       } 
      } 
      // remove all but first row 
      var rowsToRemove = grpDup.Skip(1); 
      foreach(DataRow rowToRemove in rowsToRemove) 
       table.Rows.Remove(rowToRemove); 
     } 
    } 

    return table; 
} 

Использование:

var tables = DTrightSplitH2.Concat(DTleftSplitH2).ToArray(); 
DataTable TblUnion = tables.MergeAll("key"); 
+0

есть ключ в каждой таблице – iakovl2

+0

Затем вы должны показать пример структуры некоторых таблиц и желаемого результата. –

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