2

我有两个这样的数据表:

dt1:

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

dt2:

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

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

dt结果:

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

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

4

5 回答 5

5

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

Select a.ID1, b.ID2 
FROM   dt1 A CROSS JOIN dt2 B
于 2012-07-30T07:11:16.627 回答
4

做一个完整的加入:

Select a.ID1, b.ID2 FROM dt1 A,dt2 B
于 2012-07-30T07:05:01.357 回答
2

林克:

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);
        }
于 2012-07-30T09:34:16.797 回答
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();
于 2012-07-30T07:41:47.700 回答
0

谢谢大家,但我已经通过 LINQ 中的 Foreach 方法解决了它。

于 2012-10-21T10:14:43.107 回答