2011-05-17 64 views
2

我正在使用帶有單個SqlDbType.Structured參數的ADO.NET SqlCommand將表值參數發送給存儲過程。該sproc返回許多行,我需要進入一個強類型列表。將結果集(DataTable或DataReader位的DataTable)轉換爲List的最佳方法是什麼?將SqlCommand輸出轉換爲列表<MyType>?

謝謝。

+0

數據集可能是你最好的朋友在這裏,但話又說回來數據集是有點討厭.... – 2011-05-17 17:00:16

+0

事實證明,這是很多喜歡http://stackoverflow.com/問題/ 1464883/how-can-i-easily-convert-datareader-to-listt - 謝謝大家! – Snowy 2011-05-17 18:21:10

回答

16

您可以使用LINQ使用DataReader:

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

但是爲什麼在他已經使用ado的時候使用ling? – 2011-05-17 17:01:32

+6

@Laurence:呃,爲什麼不呢?如果你真的想要使用循環,你可以。 LINQ不是LINQ to SQL。 – SLaks 2011-05-17 17:20:06

2

最有效的方法是使用的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

我認爲你可以使用Dapper的查詢轉換爲一類。

更多信息,請參閱我的答案在this link

相關問題