2010-12-01 14 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; 

Le codage ci-dessus donne le résultat dans la première colonne comme suit: System.Linq.Enumerable + d__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0 2 [System.Data.DataRow, System.Data.DataRow]]Résultat inattendu lors de la connexion de deux données?

+0

Je ne sais pas si cela vaut, mais il y a [question similaire ici sur SO] [1] avec une réponse appropriée. [1]: http: //stackoverflow.com/questions/997847/join-two-data-tables-from-different-source-databases-in-net –

Répondre

2

@Prem: Après avoir compris votre code je suis sûr que vous obtiendrez exception comme

« Impossible de jeter l'objet de type « d__61 4[System.Data.DataRow,System.Data.DataRow,System.String,<>f__AnonymousType0 2 [System.Data.DataRow, System.Data.Data Row]] 'pour taper' System.Data.DataRow '. "

sur

finaldt.Rows.Add ((DataRow) combinedrows); Vous devez donc stocker le résultat de retour Linq dans var, puis vous pouvez ajouter une ligne à la nouvelle DataTable par boucle.

votre code devrait être

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

Essayes au nom de vous, je l'ai vérifié est en cours d'exécution sinon poster l'erreur.

Pour obtenir seulement une colonne particulière de DataTable vous devez changer LINQ comme

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

et Récupération des données que vous devez faire:

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

dt1 dépasse la portée de la boucle foreach. – Prem

+0

dt1 est votre dataTable qui est dans la portée vérifier la réponse mise à jour. –

+0

Pourriez-vous me dire comment obtenir uniquement la colonne particulière de dt1 en utilisant l'instruction select - select new {dt1, dt2} – Prem

1

essayer cette

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

Mais dt1 ne fait pas partie de la portée de foreach loop. – Prem