我有一个将 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 中的记录只能枚举一次(或者我完全遗漏了什么)?这意味着我必须将 AsEnumerable 的结果复制到 List 中,以便可以多次枚举它们。
var temp = records.ToList();
至少,我认为这是我必须做的。但是当我更改我的 foreach 循环以迭代临时集合时,我得到:
InvalidOperationException:行/列不存在数据
我在这里想念什么?