【问题标题】:Merge two datatables in C#?在 C# 中合并两个数据表?
【发布时间】:2018-05-18 14:25:49
【问题描述】:

我有两个数据表..

DataTable dtTemp= new DataTable();
            dtTemp.Columns.AddRange(new[]
            {
                new DataColumn("segment_id", typeof(int)),
                new DataColumn("seg_description")
            });


DataTable dtTemp2 = new DataTable();
dtTemp2.Columns.Add("set_id",typeof(int));

现在让我们在第一个表中添加一些行..

segment_id|seg_description
------    |---------------
   1      | desc..
   2      | desc2..
   3      | desc3..

现在让我们将一些数据放入第二个表中..

 set_id
--------
   1
--------
   2

现在,我想让这两个表低于输出

set_id  | segment_id |seg_description
--------| ---------- | --------------
    1   |    1       |  desc..
    1   |    2       | desc2..
    1   |    3       | desc3..
    2   |    1       |   desc..
    2   |    2       | desc2..
    2   |    3       | desc3.. 

我该怎么做?使用 Merge() 可以做到这一点吗?

【问题讨论】:

  • 输出 = 表 1 x 表 2..

标签: c# datatable


【解决方案1】:

所以您想通过构建所有行的笛卡尔积来“交叉连接”这些表?当然没有内置方式,你可以使用这个方法:

public static DataTable CrossJoinTables(DataTable t1, DataTable t2)
{
    if (t1 == null || t2 == null)
        throw new ArgumentNullException("t1 or t2", "Both tables must not be null");

    DataTable t3 = t1.Clone();  // first add columns from table1
    foreach (DataColumn col in t2.Columns)
    {
        string newColumnName = col.ColumnName;
        int colNum = 1;
        while (t3.Columns.Contains(newColumnName))
        {
            newColumnName = string.Format("{0}_{1}", col.ColumnName, ++colNum);
        }
        t3.Columns.Add(newColumnName, col.DataType);
    }

    IEnumerable<object[]> crossJoin = 
        from r1 in t1.AsEnumerable()
        from r2 in t2.AsEnumerable()
        select r1.ItemArray.Concat(r2.ItemArray).ToArray();

    foreach(object[] allFields in crossJoin)
    {
        t3.Rows.Add(allFields);
    }

    return t3;
}

用法:

DataTable tblresult = CrossJoinTables(dtTemp2, dtTemp); // swapped order because you want columns from dtTemp2 first

【讨论】:

    【解决方案2】:

    为此,您需要使用CROSS JOIN 操作。

    Select * Table1 CROSS JOIN Table2
    

    它实际上为您提供了两个表的乘积:A 中的每一行连接到 B 中的每一行。如果 A 有 100 行,B 有 100 行,则交叉连接有 10,000 行。

    【讨论】:

    • 那不是 SQL,而是 DataTable 这是一个 .NET 集合
    • 我想我可以使用 Linq 进行交叉连接吗?@TimSchmelter 还有其他方式吗?
    • @Nody 那么你可能想接受答案以关闭它
    【解决方案3】:

    这个怎么样:

    var dt1 = dtTemp1.AsEnumerable();
    var dt2 = dtTemp2.AsEnumerable();
    
    var q = from x in dt1
            from y in dt2
            select new { set_id = (int)y["set_id"], segment_id = (int)x["segment_id"], seg_description = (string)x["seg_description"] };
    

    【讨论】:

    • DataTable 没有实现 IEnumerable,实际上它们在 IEnumerable 之前就已经存在,所以没有直接在上面查询。
    • dtTemp2.​​rows 是可查询的,拥有你需要的一切。
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多