如何在2个DataTable上执行Union All

时间:2015-12-31 08:55:35

标签: c# datatable

我没有使用Entity Framework。 有2个数据表,每个数据表都有不同的编号。列。有一个共同的列 - ItemId

如果是Union,我会使用'Merge',但不知道如何为这2个DataTables做Union All

public static void Main()
    {
        //First DataTable
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("ItemId");
        dt1.Columns.Add("Name");
        dt1.Columns.Add("Color");

        DataRow dr = dt1.NewRow();
        dr["ItemId"] = "1";
        dr["Name"] = "Name1";
        dr["Color"] = "Color1";
        dt1.Rows.Add(dr);

        dr = dt1.NewRow();
        dr["ItemId"] = "2";
        dr["Name"] = "Name2";
        dr["Color"] = "Color2";
        dt1.Rows.Add(dr);

        //Second DataTable
        DataTable dt2 = new DataTable();
        dt2.Columns.Add("ItemId");
        dt2.Columns.Add("Name");
        dt2.Columns.Add("Price");

        DataRow dr2 = dt2.NewRow();
        dr2["ItemId"] = "1";
        dr2["Name"] = "Name1";
        dr2["Price"] = "100";
        dt2.Rows.Add(dr2);

        dr2 = dt2.NewRow();
        dr2["ItemId"] = "2";
        dr2["Name"] = "Name3";
        dr2["Price"] = "200";
        dt2.Rows.Add(dr2);
    }

预期产出

ItemId  Name    Color   Price
1       Name1   Color1
2       Name2   Color2
1       Name1            100  
2       Name3            200

3 个答案:

答案 0 :(得分:4)

您可以使用DataTable.Merge()

如果您在两个表中都有主键,那么它将在主键上执行合并,否则它将直接附加所有记录。

在你的情况下,将ItemID作为主键。

答案 1 :(得分:1)

使用System.Linq.Expressions; ......

    var result1 = from row1 in dt1.AsEnumerable()                     
                 select new { Name = row1.Field<String>("Name"), Color = row1.Field<String>("Color"), Price = "" };

        var result2 = from row1 in dt2.AsEnumerable()                     
                      select new { Name = row1.Field<String>("Name"), Color = "", Price = row1.Field<String>("Price") };
        var res = result1.Concat(result2);

        foreach (var item in res)
        Console.WriteLine("{0} - {1} - {2}", item.Name, item.Color, item.Price);

答案 2 :(得分:0)

即使这个问题已经存在多年了,对于任何寻求另一种方法的人:

        public static DataTable MergeTables(DataTable dt1, DataTable dt2)
    {
        DataTable dt3 = dt1.Clone();
        foreach (DataColumn col in dt2.Columns)
        {
            string strColumnName = col.ColumnName;
            int intColNum = 1;
            while (dt3.Columns.Contains(strColumnName))
            {
                strColumnName = string.Format("{0}_{1}", col.ColumnName, ++intColNum);
            }
            dt3.Columns.Add(strColumnName, col.DataType);
        }
        var Mergered = dt1.AsEnumerable().Zip(dt2.AsEnumerable(), (r1, r2) => r1.ItemArray.Concat(r2.ItemArray).ToArray());
        foreach (object[] rowFields in Mergered)
            dt3.Rows.Add(rowFields);

        return dt3;
    }