У меня есть метод расширения для преобразования 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, заключается в том, что мне нужно выполнить запрос LINQ для записей перед блоком foreach. Как вы знаете, записи в DbDataReader могут быть перечислены только один раз (или я что-то упустил полностью)? Это означает, что мне нужно скопировать результаты AsEnumerable в список, чтобы я мог перечислить их несколько раз.
var temp = records.ToList();
По крайней мере, я думал, что это то, что я должен был сделать. Но когда я изменяю свой цикл foreach для итерации по временной коллекции, я получаю:
InvalidOperationException: нет данных для строки / столбца
Что мне здесь не хватает?