2010-07-15 57 views
2

比方说,我有两个DataTable DT1和DT2单行。C#中的DataTable#

DT1有3列:Col1中,Col2中,和COL3

DT2有2列:可乐,COLB。

是否可以水平连接这两个DataTables,因此我得到Col1,Col2,Col3,ColA和ColB?

+0

当你说*加入*时,你是什么意思?你期待一两行吗? – Kobi 2010-07-15 10:13:25

+0

我希望他们在一行中。 – Rabin 2010-07-15 10:54:48

回答

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否,DataSetDataTable不支持自动连接。您必须手动执行连接,方法是向表中添加新列并从其他表中复制列值。

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但在SELECT语句中定义的IEnumerable<T>收集匿名类型的对象。 Obvoiusly我刚刚猜测了连接标准和列的数据类型,因此您必须指定适合您的实际数据的那些标准。

+0

这是一个很好的答案,但我认为问题中描述的两个表格没有共同的键。换句话说,我相信他要求加入两种潜在不同类型的数据。因此,table1中的'Col1'可能是一个'int',但table2中的ColA可能是'varchar'。 – 2010-07-15 10:36:10

+0

Jason是正确的。他们没有共同的钥匙,他们只是携带一堆数字。 – Rabin 2010-07-15 10:50:38

+0

通过使用多个from并将条件放在where子句中,您可以在任何情况下指定linq中的连接,如果您有外键类型关系,这只是最简单的选项。如果你可以指定如何关联每个表中的行,那么我可以用相关连接更新我的答案。 – 2010-07-15 11:37:54