DbDataReader を IEnumerable オブジェクトに変換する拡張メソッドがあります。
public static IEnumerable<IDataRecord> AsEnumerable(this DbDataReader reader) {
while (reader.Read()) {
yield return reader;
}
}
私のアプリケーションでは、次のようにデータベースにクエリを実行します。
var records = context.Query("select WRKORDNBR from WRKORDER").AsEnumerable();
その後、各レコードを列挙し、WRKORDNBR フィールドの値を取得します。
foreach (var record in records) {
DoSomething((int)record["WRKORDNBR"]);
}
これは以前はうまくいきました。ここで、わざわざ DbDataReader を変換した理由は、foreach ブロックの前にレコードに対して LINQ クエリを実行する必要があるためです。ご存知のように、DbDataReader のレコードは 1 回しか列挙できません (または、完全に何かが欠けているのでしょうか)。つまり、AsEnumerable の結果を List にコピーして、複数回列挙できるようにする必要があります。
var temp = records.ToList();
少なくとも、それが私がしなければならないことだと思いました。しかし、 foreach ループを変更して一時コレクションを反復処理すると、次のようになります。
InvalidOperationException: 行/列にデータが存在しません
ここで何が欠けていますか?