2010-07-15 2 views
2

Предположим, у меня есть два DataTables DT1 и DT2 с одной строкой.DataTable в C#

DT1 имеет 3 колонки: Col1, COL2 и COL3

и

DT2 имеет 2 колонки: кола, ColB.

Можно ли объединить эти два DataTables горизонтально, чтобы получить Col1, Col2, Col3, ColA и ColB?

+0

Что вы имеете в виду, когда говорите * присоединяйтесь *? вы ожидаете одну или две строки? – Kobi

+0

Я хочу их в одном ряду. – Rabin

ответ

2

Я тонкий, вы должны добавить новые столбцы и скопировать данные либо в третьей таблице или в одном из существующей таблицы

DataTable dt1 = new DataTable(); 

    dt1.Columns.Add("col1", typeof(string)); 
    dt1.Columns.Add("col2", typeof(string)); 
    dt1.Columns.Add("col3", typeof(string)); 

    DataTable dt2 = new DataTable(); 

    dt2.Columns.Add("cola", typeof(string)); 
    dt2.Columns.Add("colb", typeof(string)); 

    object[] row = {'1', '2', '3'}; 
    dt1.Rows.Add(row); 

    object[] row1 = { 'a', 'b' }; 
    dt2.Rows.Add(row1); 

    // Create columns in dt1 
    dt1.Columns.Add("cola", typeof(string)); 
    dt1.Columns.Add("colb", typeof(string)); 

    // Copy data from dt2 
    dt1.Rows[0]["cola"] = dt2.Rows[0]["cola"]; 
    dt1.Rows[0]["colb"] = dt2.Rows[0]["colb"]; 
0

AFAIK no, DataSet и DataTable не поддерживают автоматические соединения. Вам нужно будет выполнить объединение вручную, добавив новые столбцы в таблицу и скопировав значения столбца из других таблиц.

0

До тех пор, как вы просто хотите коллекцию вы можете связываться вы можете сделать следующее :

var results = from rs1 in table1.Rows.Cast<DataRow>() 
       join rs2 in table2.Rows.Cast<DataRow>() on rs1.Field<int>("col1") equals rs2.Field<int>("colA")       
       select new { col1 = rs1.Field<int>("col1"), col2 = rs1.Field<string>("col3"), col3 = rs1.Field<string>("col3"), colA = rs1.Field<int>("colA"), colB = rs1.Field<string>("colB") }; 

Вы не получите DataTable но IEnumerable<T> коллекция объектов анонимного типа, как это определено в операторе отбора. Obvoiusly Я только что догадался о критериях присоединения и типе данных столбцов, поэтому вам нужно будет указать их в зависимости от ваших фактических данных.

+0

Это хороший ответ, но я думаю, что две таблицы, описанные в вопросе, не имеют общего ключа. Другими словами, я считаю, что он просит присоединиться к потенциально различным типам данных. Поэтому 'Col1' в таблице1 может быть' int', но 'ColA' в таблице2 может быть' varchar'. –

+0

Джейсон прав. У них нет общего ключа, они просто несут кучу чисел. – Rabin

+0

Вы можете указать соединения в linq в любом случае, используя несколько элементов и поместив критерии в предложение where, это самый простой вариант, если у вас было отношение типа внешнего ключа. Если бы вы могли указать, как связать строки в каждой таблице, я могу обновить свой ответ с помощью соответствующего соединения. –

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