C# 使用LINQ,C将两个数据表合并到单个数据表
ASP.NET使用C.NET。NET3.5 我有两个数据表,如下所示: 数据表1: 数据表2: 如何组合这两个数据表以使用LINQ获得以下作为数据表的输出,而不循环每一行: 组合数据表: 编辑:C# 使用LINQ,C将两个数据表合并到单个数据表,c#,asp.net,linq,.net-3.5,C#,Asp.net,Linq,.net 3.5,ASP.NET使用C.NET。NET3.5 我有两个数据表,如下所示: 数据表1: 数据表2: 如何组合这两个数据表以使用LINQ获得以下作为数据表的输出,而不循环每一行: 组合数据表: 编辑: 只要根据匹配的“位置”连接两个表,我就希望得到组合形式的结果数据。我不想手动选择每个列字段作为select new{….} 我相信你可以这样做: IEnumerable<DataRow> res = from d1 in DataTable1.AsEnumerable()
只要根据匹配的“位置”连接两个表,我就希望得到组合形式的结果数据。我不想手动选择每个列字段作为select new{….} 我相信你可以这样做:
IEnumerable<DataRow> res =
from d1 in DataTable1.AsEnumerable()
join d2 in DataTable2.AsEnumerable() on d1["Location"] equals d2["Location"]
select new DataRow
{
d1["Location"],
d1["Visa_Q1"],
d1["Visa_Q2"],
d2["Visa_Q3"],
d2["Visa_Q4"]
};
DataTable CombinedDataTable = res.CopyToDataTable<DataRow>();
试试这个
var results = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on table1["Location"] equals table2["Location"]
select new
{
Location = table1["Location"],
Visa_Q1 = (int)table1["Visa_Q1"],
Visa_Q2 = (int)table1["Visa_Q2"],
Visa_Q3 = (int)table2["Visa_Q3"],
Visa_Q4 = (int)table2["Visa_Q4"],
};
编辑
对“选择所有列”尝试此操作
DataTable table = new DataTable();
foreach (DataColumn column in t1.Columns)
{
table.Columns.Add(column.ColumnName, column.DataType);
}
foreach (DataColumn column in t2.Columns)
{
if (column.ColumnName == "Location")
table.Columns.Add(column.ColumnName + "2", column.DataType);
else
table.Columns.Add(column.ColumnName, column.DataType);
}
var results = t1.AsEnumerable().Join(t2.AsEnumerable(),
a => a.Field<String>("Location"),
b => b.Field<String>("Location"),
(a, b) =>
{
DataRow row = table.NewRow();
row.ItemArray = a.ItemArray.Concat(b.ItemArray).ToArray();
table.Rows.Add(row);
return row;
});
如果不存在“n”个动态非静态列。是否需要从每个表中手动选择每个列字段?在这个场景中,我如何通过根据匹配的“位置”连接两个表来获得结果?我希望结果数据以组合形式出现。我不想像您在上面的SelectNew{….}中提到的那样手动选择每个列字段;获取异常:System.ArgumentException未被用户代码消息处理=输入数组长于此表中的列数。Source=System.DATA当我尝试执行以下语句时,我得到了上述异常:table=results.CopyToDataTable@sukumar为什么要将结果复制到datatable?在上面的第二个解决方案中,结果将保存在您需要声明的表中。顺便说一句,如何在不手动选择单独的列字段(如Visa_Q1、Q2…等)的情况下获得上述结果组合数据表?仅通过基于匹配的“位置”合并两个表,我想要组合形式的结果数据。我不想像您在上面的SelectNew{….}中提到的那样手动选择每个列字段;我不知道Linq有什么方法可以做到这一点,所以我想你必须在新的子句中添加一些逻辑来进行组合,就像@HarisHasan所建议的那样。你的要求是禁止循环吗?由于性能要求,我们一致尽可能少地使用循环。所以我需要Linq你从哪里得到数据表?如果要避免循环,您需要修改该代码-LINQ to对象只是在内部使用循环。
IEnumerable<DataRow> res =
from d1 in DataTable1.AsEnumerable()
join d2 in DataTable2.AsEnumerable() on d1["Location"] equals d2["Location"]
select new DataRow
{
d1["Location"],
d1["Visa_Q1"],
d1["Visa_Q2"],
d2["Visa_Q3"],
d2["Visa_Q4"]
};
DataTable CombinedDataTable = res.CopyToDataTable<DataRow>();
var results = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on table1["Location"] equals table2["Location"]
select new
{
Location = table1["Location"],
Visa_Q1 = (int)table1["Visa_Q1"],
Visa_Q2 = (int)table1["Visa_Q2"],
Visa_Q3 = (int)table2["Visa_Q3"],
Visa_Q4 = (int)table2["Visa_Q4"],
};
DataTable table = new DataTable();
foreach (DataColumn column in t1.Columns)
{
table.Columns.Add(column.ColumnName, column.DataType);
}
foreach (DataColumn column in t2.Columns)
{
if (column.ColumnName == "Location")
table.Columns.Add(column.ColumnName + "2", column.DataType);
else
table.Columns.Add(column.ColumnName, column.DataType);
}
var results = t1.AsEnumerable().Join(t2.AsEnumerable(),
a => a.Field<String>("Location"),
b => b.Field<String>("Location"),
(a, b) =>
{
DataRow row = table.NewRow();
row.ItemArray = a.ItemArray.Concat(b.ItemArray).ToArray();
table.Rows.Add(row);
return row;
});