[英]“No data exists for the row/column” exception after using ToList
我有一个扩展方法将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的结果复制到一个列表中,以便可以多次枚举它们。
var temp = records.ToList();
至少,我认为那是我必须要做的。 但是,当我更改foreach循环以遍历temp集合时,我得到:
InvalidOperationException:行/列中没有数据
我在这里想念什么?
您的枚举不包含不同的对象,但是所有枚举都返回相同的实例(您的阅读器)。 基本上,您正在执行以下操作:
var list = new List<IDataRecord>();
while (reader.Read())
{
list.Add(reader);
}
循环结束后,reader将不包含任何内容,而如果您查看列表中的任何“项目”,则将获得任何内容。 如果您尝试在倒数第二个项目处停止,那么您还会看到它们都包含相同的值。
它不包含列表的原因是因为您正在执行以下操作:
while (reader.Read())
{
DoSomething((int)record["WRKORDNBR"]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.