2010-07-15 58 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