从2个表中选择所有行的组合

时间:2012-07-30 06:58:51

标签: c# datatable cartesian-product

我有两个这样的数据表:

DT1:

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

DT2:

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

现在,我想从这两个数据表中检索所有项目的组合,结果将包含50(10 x 5)行 - 如下所示:

dtResult:

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

有没有简单的方法而不是使用循环?

5 个答案:

答案 0 :(得分:5)

您正在寻找笛卡尔积。使用CROSS JOIN

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

答案 1 :(得分:4)

完整加入:

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

答案 2 :(得分: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);
        }

答案 3 :(得分: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();

答案 4 :(得分:0)

非常感谢,但我已经通过LINQ中的Foreach方法解决了这个问题。