2011-05-17 4 views
2

J'utilise une SqlCommand ADO.NET avec un seul paramètre SqlDbType.Structured pour envoyer un paramètre table à un sproc. Le sproc renvoie plusieurs lignes, que j'ai besoin d'entrer dans une liste fortement typée. Quelle est la meilleure façon de convertir le jeu de résultats (que DataTable d'un DataAdapter ou DataReader bits) dans la liste?Convertir sortie SqlCommand à la liste <MyType>?

Merci.

+0

DataSets peut être votre meilleur ami ici, mais là encore des jeux de données sont un peu méchant .... Il se –

+0

c'est un peu comme http://stackoverflow.com/ questions/1464883/how-can-je-facilement-convertir-datareader-to-listt - merci à tous! – Snowy

Répondre

16

Vous pouvez utiliser LINQ avec un DataReader:

var list = reader.Cast<IDataRecord>() 
       .Select(dr => new YourType { Name = dr.GetString(0), ... }) 
       .ToList(); 
+0

Mais pourquoi utiliser ling quand il utilise déjà ado ???? –

+6

@Laurence: Euh, pourquoi pas? Si vous voulez vraiment utiliser une boucle à la place, vous pouvez. LINQ n'est pas LINQ to SQL. – SLaks

2

La façon la plus efficace utilise datareader:

var items = new LinkedList<MyClass>(); 
using(var connection = GetConnection()) { 
    using(var cmd = connection.CreateCommand()){ 
     cmd.CommandText = "... your SQL statement ..."; 
     // ... add parameters 

     cnn.Open(); 
     using(var reader = cmd.ExecuteReader()) { 
      // accessing values via number index is most efficient 

      //gets index of column with name "PrimaryKey" 
      var ndxPrimaryKey = reader.GetOrdinal("PrimaryKey"); 
      var ndxColumn1 = reader.GetOrdinal("Column1"); 
      var ndxColumn2 = reader.GetOrdinal("Column2"); 

      while(reader.Read()) { 
       var item = new MyClass(); 

       // returns value of column "PrimaryKey" typed to nullable Guid 
       item.PrimaryKey = reader.GetValue(ndxPrimaryKey) as Guid?; 
       item.Column1 = reader.GetValue(ndxColumn1) as string; 
       item.Column2 = reader.GetValue(ndxColumn2) as int?; 

       items.AddLast(item); 
      } 
     } 
     cnn.Close(); 
    } 
} 

return items; 
0

je pense que vous pouvez utiliser Dapper pour convertir une requête à une classe.

pour plus d'informations, voir ma réponse à this link

Questions connexes