2012-04-05 3 views
0

У меня есть список datatables. Что может быть самым эффективным способом объединить их в единую таблицу данных? Схема каждой из этих таблиц данных различна, и количество строк этих таблиц может отличаться.Union DataTables C#

т.е.

  • Таблица1 имеет столбцы A, B

  • Table2 имеет столбцы C, D

  • Таблица3 имеет столбцы E, F

Мой вывод должен быть таблицей результатов со всеми вышеуказанными столбцами и содержать все строки.

Возможно ли это в нескольких строках кода? Может ли LINQ быть вариантом?

+0

Я могу сделать это в ... трех строках кода. – AMissico

+1

На самом деле, два ... – AMissico

ответ

0

Решение моей выше вопрос:

   DataColumn[] keys = new DataColumn[1]; 

       DT.Columns.Add(primaryColumn, typeof(System.Int32)); 
       for (int i = 0; i < DT.Rows.Count; i++) 
       { 
        DT.Rows[i][primaryColumn] = i; 
       } 
       keys[0] = DT.Columns[primaryColumn]; 
       mapDT.PrimaryKey = keys; 

       tables.Add(DT); 

    private static DataTable MergeDataTables(List<DataTable> tables, string keyColumn) 
    { 
     DataTable mergedTable = new DataTable(); 

     foreach (DataTable dt in tables) 
      mergedTable.Merge(dt); 

     mergedTable.PrimaryKey = null; 

     mergedTable.Columns.Remove(keyColumn); 

     return mergedTable; 
    } 

Надежда, что помогает.

1

Использовал метод Merge. См. http://msdn.microsoft.com/en-us/library/fk68ew7b.aspx.


Обновление по вашему запросу. Если в каждой таблице есть только два столбца, то вы не можете использовать метод Merge, как вы ожидаете.

Чтобы сделать то, что вы хотите, вам понадобится первичный ключ на каждой таблице. Когда строка имеет общий идентификатор между таблицами, столбцы будут объединены, а не добавлена ​​строка. Например, если RowId 1 находится как в таблице 1, так и в таблице 2, вы получите RowId 1; A, B, C, D, Null, Null. Если RowId 2 находится в таблице 1, тогда вы получите RowId2; A, B, Null, Null, Null, Null.

http://msdn.microsoft.com/en-us/library/system.data.missingschemaaction.aspx

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

+0

merge увеличит количество строк. Я просто хочу добавить все эти столбцы с данными в одну таблицу. – Cannon

+0

Тогда я не понимаю, чего вы хотите. Да, очевидно, это увеличит количество строк. Важно иметь первичные ключи в этих таблицах, если вы хотите добавить данные столбца для строк. Например, если у меня есть первичный ключ, установленный в Id для каждой таблицы, тогда строки с одним и тем же идентификатором будут иметь данные столбца, добавленные вместо добавленной строки. – AMissico

+0

@buffer_overflow, так как они все разные, а количество столбцов может быть разным, вам нужно добавить каждую таблицу с помощью другой команды. Другого пути нет, поскольку слияние - это не то, что вам нужно. – alex