连接两个数据表时出现意外结果?

时间:2010-12-01 04:49:06

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

 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__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0 2 [的System.Data.DataRow,的System.Data.DataRow]]

2 个答案:

答案 0 :(得分:2)

@Prem:在理解你的代码后,我相信你会得到像

这样的异常

“无法转换类型为'd__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0的对象2 [System.Data.DataRow,System.Data.DataRow]]''键入'System.Data.DataRow'。”

on

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

答案 1 :(得分:1)

试试这个

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;