【问题标题】:Unexpected Result while joining two datatables?连接两个数据表时出现意外结果?
【发布时间】:2010-12-01 04:49:06
【问题描述】:
 object combinedrows = from dt1 in DsResults.Tables[0].AsEnumerable()
                           join dt2 in DsResults.Tables[1].AsEnumerable() on dt1.Field<string>("MethodName") equals dt2.Field<string>("MethodName")
                           select new { dt1, dt2 };
        DataTable finaldt = new DataTable("FinalTable");
        finaldt.Columns.Add(new DataColumn("sp",typeof(string)));
        finaldt.Columns.Add(new DataColumn("Method",typeof(string)));
        finaldt.Columns.Add(new DataColumn("Class",typeof(string)));
        finaldt.Columns.Add(new DataColumn("BLLMethod",typeof(string)));
        DataRow newrow = finaldt.NewRow();
        finaldt.Rows.Add((DataRow)combinedrows);
        dataGridView5.DataSource = finaldt;

上面的编码在第一列给出的结果如下: System.Linq.Enumerable+d__614[System.Data.DataRow,System.Data.DataRow,System.String,&lt;&gt;f__AnonymousType02[System.Data.DataRow,System.Data.DataRow]]

【问题讨论】:

标签: c# .net linq ado.net datatable


【解决方案1】:

@Prem:在理解了你的代码之后,我相信你会得到类似的异常

“无法将 'd__614[System.Data.DataRow,System.Data.DataRow,System.String,&lt;&gt;f__AnonymousType02[System.Data.DataRow,System.Data.DataRow]]' 类型的对象转换为 'System.Data.DataRow' 类型。”

finaldt.Rows.Add((DataRow)combinedrows);线

所以你必须将Linq返回结果存储在var中,然后你可以通过循环将行添加到新的DataTable中。

你的代码应该是

      var combinedrows = from dt1 in DsResults.Tables[0].AsEnumerable()
                              join dt2 in DsResults.Tables[1].AsEnumerable() on             dt1.Field<string>("MethodName") equals dt2.Field<string>("MethodName")
                              select new { dt1, dt2 };

        DataTable finaldt = new DataTable("FinalTable");
        finaldt.Columns.Add(new DataColumn("sp", typeof(string)));
        finaldt.Columns.Add(new DataColumn("Method", typeof(string)));
        finaldt.Columns.Add(new DataColumn("Class", typeof(string)));
        finaldt.Columns.Add(new DataColumn("BLLMethod", typeof(string)));
        DataRow newrow = finaldt.NewRow();           
        foreach (var row in combinedrows)
        {

            DataRow dataRow = finaldt.NewRow();
            dataRow.ItemArray = row.dt1.ItemArray;

             finaldt.Rows.Add(dataRow);
        }

代表你尝试一下,我已经检查过它是否正在运行,如果没有,则发布错误。

要从 DataTable 中仅获取特定列,您需要更改 LINQ,例如

 var combinedrows = from dt1 in DsResults.Tables[0].AsEnumerable()
                              join dt2 in DsResults.Tables[1].AsEnumerable() on dt1.Field<string>("MethodName") equals dt2.Field<string>("MethodName")
                           select new { td1Col = dt1.Field<string>("Tab1col2")}; 

对于检索数据,您需要执行以下操作:

       foreach (var row in combinedrows)
        {
            string value = row.td1Col.ToString();                                
        }

【讨论】:

  • dt1 超出了 foreach 循环的范围。
  • dt1 是您的数据表,它在范围检查更新的答案中。
  • 请告诉我如何使用 select 语句从 dt1 中仅获取特定列 - select new {dt1,dt2}
【解决方案2】:

试试这个

var combinedrows = from dt1 in DsResults.Tables[0].AsEnumerable() 
                       join dt2 in DsResults.Tables[1].AsEnumerable() on dt1.Field<string>("MethodName") equals dt2.Field<string>("MethodName") 
                       select new { dt1, dt2 }; 
    DataTable finaldt = new DataTable("FinalTable"); 
    finaldt.Columns.Add(new DataColumn("sp",typeof(string))); 
    finaldt.Columns.Add(new DataColumn("Method",typeof(string))); 
    finaldt.Columns.Add(new DataColumn("Class",typeof(string))); 
    finaldt.Columns.Add(new DataColumn("BLLMethod",typeof(string))); 

        foreach (var row in combinedrows)
        {

            DataRow drow = finaldt.NewRow();
            drow.ItemArray = row.dt1.ItemArray;

             finaldt.Rows.Add(drow34);
        }

      dataGridView5.DataSource = finaldt; 

【讨论】:

  • 但是 dt1 不属于 foreach 循环的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多