2012-07-30 43 views
2

我有兩個DataTable這樣選擇行的所有組合:從2個表

DT1:

ID1 
---------- 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 

DT2:

ID2 
---------- 
    1 
    2 
    3 
    4 
    5 

現在,我想要檢索的所有組合來自這兩個數據表的項目使得結果將包含50(10 x 5)行 - 如下所示:

dtResul t:

ID1  ID2 
------------ 
1  1 
1  2 
1  3 
1  4 
1  5 
2  1 
2  2 
2  3 
2  4 
2  5 
3  1 
.  . 
.  . 
.  . 

有沒有簡單的方法,而不是使用循環?

+0

你如何填充兩個數據表?從一個單獨的數據庫還是從兩個單獨的數據庫? – alextansc 2012-07-30 07:02:35

+2

使用交叉連接,在數據庫理論中它被稱爲笛卡兒積。 – 2012-07-30 07:02:47

+0

@ alextansc,我已經通過代碼和dt2從數據庫中選擇查詢來創建dt1。 – 2012-07-30 07:37:44

回答

0

謝謝大家,但我已經在LINQ的foreach方法解決它。

4

做一個完整的加盟:

Select a.ID1, b.ID2 FROM dt1 A,dt2 B 
+0

我不確定你的意思是「完全加入」。大多數人可能會認爲這是一個完全的外連接,這顯然不是我們在這裏討論的。您提供的查詢當然是正確的。 – shawnt00 2012-08-01 05:30:44

5

您正在查詢笛卡爾乘積。使用CROSS JOIN

Select a.ID1, b.ID2 
FROM dt1 A CROSS JOIN dt2 B 
1

使用

  DataTable dt1 = new DataTable(); 
      dt1.Columns.AddRange(new DataColumn[] { 
      new DataColumn("ID1") }); 

      for (int i = 0; i < 10; i++) 
       dt1.Rows.Add(i + 1); 

      DataTable dt2 = new DataTable(); 
      dt2.Columns.AddRange(new DataColumn[] { 
      new DataColumn("ID2") }); 

      for (int i = 0; i < 5; i++) 
       dt2.Rows.Add(i + 1); 

      var queryOne = from row in dt1.AsEnumerable() 
          from row1 in dt2.AsEnumerable() 
          select new 
          { 
           id1 = row.Field<string>("ID1"), 
           id2 = row1.Field<string>("ID2") 
          }; 

      var result = queryOne.ToList(); 
2

LINQ:

var combinedRows = from a in dt1.AsEnumerable() 
        from b in dt2.AsEnumerable() 
        select new { ColumnID1 = a["ID1"], ColumnID2 = b["ID2"] }; 
     foreach (var item in combinedRows) 
     { 
      row = dt3.NewRow(); 
      row["ID1"] = item.ColumnID1; 
      row["ID2"] = item.ColumnID2; 
      dt3.Rows.Add(row); 
     }