【问题标题】:Select all available fields in LINQ query when joining two DataTables连接两个数据表时选择 LINQ 查询中的所有可用字段
【发布时间】:2016-08-18 12:57:58
【问题描述】:

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

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”和“STOCK”。谢谢。

【问题讨论】:

    标签: c# linq datatable


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多