C# 如何在2个数据表上执行联合
我没有使用实体框架。 有2个数据表,每个表的列数不同。有一个公共列-ItemId 如果是Union,我会使用“Merge”,但不知道如何对这两个数据表执行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
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之前的列的名称,我不知道这些栏目的名称