2012-07-24 5 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とDataRowで作業しているか、強く型付けされたクラスが必要ですか? – davenewza

+0

標準のADO.NET機能は、データ結果をオブジェクトにマップすることはありません。あなたは基本的にクエリから 'DataSet'を取得し、それから' Favour'オブジェクトを構築する必要があります。 – David

+3

'DataSet'行を反復し、それぞれの' Favorite'オブジェクトを 'yield'します。 – paul

答えて

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ブロック内で作業することができれば、DbDataReaderのLINQと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 ... 
} 
関連する問題