当连接两个数据表时,在LINQ查询中选择所有可用字段

本文关键字:选择 查询 LINQ 字段 连接 数据表 两个 | 更新日期: 2023-09-27 17:55:02

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

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数据表并添加列,以适应tableJoined的最终结构,但是我如何更新LINQ查询来填充tableJoined与所有可用的字段?现在,它只通过知道表包含多少列来填充"ID"、"NAME"answers"STOCK"。谢谢。

当连接两个数据表时,在LINQ查询中选择所有可用字段

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