C# 使用LINQ,C将两个数据表合并到单个数据表

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()

ASP.NET使用C.NET。NET3.5

我有两个数据表,如下所示:

数据表1:

数据表2:

如何组合这两个数据表以使用LINQ获得以下作为数据表的输出,而不循环每一行:

组合数据表:

编辑:


只要根据匹配的“位置”连接两个表,我就希望得到组合形式的结果数据。我不想手动选择每个列字段作为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;
                });