2010-12-01 13 views
1
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; 

Die obige Codierung gibt das Ergebnis in der ersten Spalte wie folgt: System.Linq.Enumerable + d__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0 2 [System.Data.DataRow, System.Data.DataRow]]Unerwartetes Ergebnis beim Verbinden von zwei Datentabellen?

+0

Nicht sicher, ob dies zutrifft, aber es gibt eine [ähnliche Frage hier zu SO] [1] mit einer passenden Antwort. [1]: http: //stackoverflow.com/questions/997847/join-two-data-tables-from-different-source-databases-in-net –

Antwort

2

@Prem: Nachdem Sie den Code zu verstehen, ich bin sicher, dass Sie Ausnahme wie

„Kann nicht werfen Objekte vom Typ‚d__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0 2 [System.Data.DataRow, System.Data.Data bekommen Zeile]] 'um' System.Data.DataRow 'einzugeben. "

auf

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

so müssen Sie Linq return result in var speichern und dann können Sie Zeile zu neuen DataTable by loop hinzufügen.

sollte Ihr Code sein

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

es versuchen, im Auftrag von Ihnen i überprüft haben es ausgeführt wird, wenn nicht dann den Fehler posten.

Für nur eine bestimmte Spalte von Datatable Sie LINQ ändern wie

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

und Abrufen von Daten müssen erhalten müssen Sie tun, um:

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

dt1 ist außerhalb des Bereichs der foreach-Schleife. – Prem

+0

dt1 ist Ihre Datentabelle, die im Umfang überprüft aktualisierte Antwort ist. –

+0

Würden Sie mir bitte sagen, wie Sie nur die bestimmte Spalte von dt1 mit der Select-Anweisung erhalten - wählen Sie new {dt1, dt2} – Prem

1

versuchen, diese

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; 
+0

Aber dt1 fällt nicht in den Bereich der foreach-Schleife. – Prem

Verwandte Themen