2009-06-24 5 views
2

私は生のADO.NET(DbConnection、DbDataReaderなど)を使用する既存のコードをたくさん持っています。私は新しいコードのためにLINQ to SQLを使うことに変わりたいと思いますが、今のところ既存のコードと新しいコードをリポジトリクラスの統一されたセットの背後に置いています。DbDataReaderにIQueryableの実装がありますか?

私が持っている問題の1つは、次のとおりです。リポジトリクラスがLINQ to SQLで無料で入手できるIQueryable <として結果セットを公開したいと思います。既存のDbDataReader結果セットをIQueryableにラップするにはどうすればよいですか?最初からDbDataReaderにIQueryableを実装する必要がありますか?

メモLINQ to DataSetは認識していますが、メモリスケールの問題でDataSetsを使用していません。対処する結果セットが非常に大きくなる可能性があります(1000sのオーダー)。これは、DbDataReaderを実装したIQueryableも効率的である必要があることを意味します(つまり、結果をメモリにキャッシュしません)。

+0

- 1つのオプション(まだ怠惰を保持していること(レコード=> BuildPerson(レコード))など - あなたにIEnumerableを与える

+0

ニース...と私のヘルパークラスは一般的なので、次のようになります: (Record => RecordToObject (record)) – DSO

答えて

5

IQueryable<T>の実装では、実際に利用可能な機能よりも多くの機能があるとは限りませんが、IEnumerable<T>として実装できます。反復子ブロックは、合理的な選択のようになります。あなたのコメントを再呼び出し側が戻ってそれをキャストし、それを悪用する可能性があるため、

public static IEnumerable<IDataRecord> AsEnumerable(
     this IDataReader reader) 
    { 
     while (reader.Read()) 
     { 
      yield return reader; // a bit dangerous 
     } 
    } 

「ビット危険」である...

+0

大丈夫だと思いますが、IQueryableではなくIEnumerableを公開する必要があります。また、IDataRecordの列値(リフレクションを使用)からオブジェクトのプロパティを読み込むユーティリティ関数が既に用意されているので、RepositoryメソッドからIDataRecordではなくエンティティオブジェクトを返すことができます。 ありがとう – DSO

+0

これはLINQでうまく機能しました。 DbDataReader reader = stmt.ExecuteReader(); // WHERE述語をここに追加してください var rows = reader fromAsEnumerable()内の_row select _row; //行を反復する foreach(行のvar行) –

関連する問題