C# 如何在2个数据表上执行联合

C# 如何在2个数据表上执行联合,c#,datatable,C#,Datatable,我没有使用实体框架。 有2个数据表,每个表的列数不同。有一个公共列-ItemId 如果是Union,我会使用“Merge”,但不知道如何对这两个数据表执行Union All public static void Main() { //First DataTable DataTable dt1 = new DataTable(); dt1.Columns.Add("ItemId"); dt1.Columns.Add("Name

我没有使用实体框架。 有2个数据表,每个表的列数不同。有一个公共列-ItemId

如果是Union,我会使用“Merge”,但不知道如何对这两个数据表执行
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

使用System.Linq.Expressions;

var result1=来自dt1.AsEnumerable()中的行1
选择新{Name=row1.Field(“Name”),Color=row1.Field(“Color”),Price=“”};
var result2=来自dt2.AsEnumerable()中的第1行
选择新的{Name=row1.Field(“Name”),Color=“”,Price=row1.Field(“Price”)};
var res=result1.Concat(result2);
foreach(资源中的var项目)
WriteLine(“{0}-{1}-{2}”,item.Name,item.Color,item.Price);

使用System.Linq.Expressions;

var result1=来自dt1.AsEnumerable()中的行1
选择新{Name=row1.Field(“Name”),Color=row1.Field(“Color”),Price=“”};
var result2=来自dt2.AsEnumerable()中的第1行
选择新的{Name=row1.Field(“Name”),Color=“”,Price=row1.Field(“Price”)};
var res=result1.Concat(result2);
foreach(资源中的var项目)
WriteLine(“{0}-{1}-{2}”,item.Name,item.Color,item.Price);

您可以使用DataTable.Merge()

如果两个表中都有主键,那么它将对主键执行合并,否则它将直接追加所有记录


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

您可以使用DataTable.Merge()

如果两个表中都有主键,那么它将对主键执行合并,否则它将直接追加所有记录


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

即使这个问题已经存在多年了,但对于任何正在寻找其他方法的人来说:

        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;
    }

尽管这个问题已经有多年历史了,但对于任何想用另一种方法来解决这个问题的人来说:

        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;
    }

我不知道如何解释“有一个公共列-ItemId”,因为似乎有两个列具有相同的名称(
ItemId
Name
),并且它们似乎在您的预期输出中得到相同的处理。我有点担心您想要的结果,因为它具有重复的ItemId。这种行为正确吗?可能与@KunalKakkad重复。是的,这种行为是正确的。项目ID在2中可能相同datatables@Damien_The_Unbeliever. 这是一个伪例子。在实际代码中,一列ItemId肯定是常见的。其他列可能相同,也可能不同。我不知道如何解释“有一个公共列-ItemId”,因为似乎有两个列具有相同的名称(
ItemId
Name
),并且它们似乎在您的预期输出中得到相同的处理。我有点担心您想要的结果,因为它具有重复的ItemId。这种行为正确吗?可能与@KunalKakkad重复。是的,这种行为是正确的。项目ID在2中可能相同datatables@Damien_The_Unbeliever. 这是一个伪例子。在实际代码中,一列ItemId肯定是常见的。其他可能相同,也可能不同。合并将删除重复项。不是吗?No merge不会删除重复记录,它只会根据主键用目标记录覆盖记录源记录。如果只想附加第二个数据表行,则不将ItemID指定为主键,只需使用merge。merge将删除重复项。不是吗?No merge不会删除重复的记录,它只会基于主键用目标记录覆盖记录源记录。如果您只想附加第二个数据表行,则不将ItemID指定为主键,只需使用merge。如果,我不知道handWhat If之前的列的名称,我不知道这些栏目的名称