Неожиданный результат при объединении двух таблиц данных? - PullRequest
1 голос
/ 01 декабря 2010
 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 ]

2 голосов
/ 01 декабря 2010

@ Prem: После понимания вашего кода я уверен, что вы получите исключение, например

"Невозможно привести объект типа 'd__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0 2 [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();                                
        }
1 голос
/ 01 декабря 2010

попробуйте

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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...