加入两个DataTable时,选择LINQ查询中的所有可用字段

时间:2016-07-06 02:26:35

标签: c# linq datatable

我正在编写一个使用LINQ连接两个DataTable的函数,问题是我不知道这两个表包含哪些列,除了表将连接的列。

string id = "ID";    
DataTable tableJoined = new DataTable();
tableJoined.Columns.Add(id, typeof(string));
tableJoined.Columns.Add("NAME", typeof(string));
tableJoined.Columns.Add("STOCK", typeof(string));


 var result = from dataRows1 in table1.AsEnumerable()
              join dataRows2 in table2.AsEnumerable()
              on dataRows1.Field<string>(id) equals dataRows2.Field<string>(id) 
              select tableJoined.LoadDataRow(new object[]
                                 {
                                    dataRows1.Field<string>(id),
                                    dataRows1.Field<string>(1),
                                    dataRows2.Field<string>(1)
                                  }, false);
            result.CopyToDataTable();

我可以构建tableJoined DataTable并随时添加列以容纳tableJoined的最终结构,但是如何更新LINQ查询以使用所有可用字段填充tableJoined ?现在它只通过知道表中包含多少列来填充“ID”,“NAME”和“STOCK”。感谢。

1 个答案:

答案 0 :(得分:1)

var tableJoined = table1.Clone(); // create columns from table1

// add columns from table2 except id
foreach (DataColumn column in table2.Columns)
{
    if (column.ColumnName != id)
        tableJoined.Columns.Add(column.ColumnName, column.DataType);
}

tableJoined.BeginLoadData();

foreach (DataRow row1 in table1.Rows)
{
    foreach (DataRow row2 in table2.Rows)
    {
        if (row1.Field<string>(id) == row2.Field<string>(id))
        {
            var list = row1.ItemArray.ToList(); // items from table1

            // add items from table2 except id
            foreach (DataColumn column in table2.Columns)
                if (column.ColumnName != id)
                    list.Add(row2[column]);

            tableJoined.Rows.Add(list.ToArray());
        }
    }
}

tableJoined.EndLoadData();