2012-07-24 88 views
15

我一直在使用Dapper和我目前的項目,我將不得不使用ADO.NET。我的問題是如何使用ADO.NET返回IEnumerable?這是我使用Dapper的。有人可以幫我轉換這個做同樣的,但與ADO?如何使用ADO.NET返回IEnumerable <>?

public IEnumerable<Favorites> GetFavorites() 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(connString)) 
    { 
     sqlConnection.Open(); 
     var work = sqlConnection.Query<Favorites>("Select * from favorites"); 
     return work; 
    } 
} 
+0

您是否開心使用DataSets和DataRows爲您的實體(例如收藏夾)或者是否需要強類型類? – davenewza 2012-07-24 15:34:41

+0

標準的ADO.NET功能不會將數據結果映射到您的對象。你基本上會從查詢中找回一個'DataSet',並且必須從中建立你的'Favorites'對象。 – David 2012-07-24 15:34:55

+3

只需遍歷DataSet行,爲每個對象產生一個新的最喜歡的對象 – paul 2012-07-24 15:35:26

回答

19

您可以使用yield return像這樣:

public IEnumerable<Favorites> GetFavorites() 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(connString)) 
    { 
     sqlConnection.Open(); 
     using (SqlCommand cmd = sqlConnection.CreateCommand()) 
     { 
      cmd.CommandText = "Select * from favorites"; 
      cmd.CommandType = CommandType.Text; 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        // Create a Favorites instance 
        var favorites = new Favorites(); 
        favorites.Foo = reader["foo"]; 
        // ... etc ... 
        yield return favorites; 
       } 
      } 
     } 
    } 
} 

很明顯,你可以通過創建一個收藏夾構造函數,它接受一個IDataReaderSqlDataReader,或創建一個實用的方法來填充值重構這個,或者無論如何,但這是基本的結構。

0

如果您可以在using區塊內完成所有工作,則可以利用LINQ和DbDataReader上的IEnumerable接口。它提供了包含相當少量代碼的自包含的純ADO.NET。

var command = connection.CreateCommand(); 
command.CommandText = "select * from favorites"; 
using (var reader = command.ExecuteReader()) { 
    var work = from IDataRecord r in select ...; 
    ... use work ... 
} 
相關問題