Исключение «Нет данных для строки / столбца» после использования ToList - PullRequest
0 голосов
/ 03 октября 2009

У меня есть метод расширения для преобразования 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: нет данных для строки / столбца

Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 03 октября 2009

Ваш перечисляемый объект не содержит отдельных объектов, но все перечисления возвращают один и тот же экземпляр (ваш читатель). Вы в основном делаете следующее:

var list = new List<IDataRecord>();
while (reader.Read()) 
{
    list.Add(reader);
}

Как только цикл заканчивается, читатель не содержит ничего, что вы получите, если посмотрите на любой из «элементов» в вашем списке. Если вы попытаетесь остановиться на предпоследнем элементе, вы также увидите, что все они содержат одинаковые значения.

Причина, по которой он работает без списка, в том, что вы делаете что-то вроде:

while (reader.Read()) 
{
    DoSomething((int)record["WRKORDNBR"]);

}
0 голосов
/ 03 октября 2009

Если у вас есть считыватель, но вы хотите набор данных, загрузить набор данных ...

Если у вас есть набор данных, но вы хотите запросить коллекцию, используйте расширения набора данных .

...