C# &引用;“行/列”不存在任何数据;使用ToList后出现异常
我有一个扩展方法将DbDataReader转换为IEnumerable对象:C# &引用;“行/列”不存在任何数据;使用ToList后出现异常,c#,.net,linq,ienumerable,dbdatareader,C#,.net,Linq,Ienumerable,Dbdatareader,我有一个扩展方法将DbDataReader转换为IEnumerable对象: public static IEnumerable<IDataRecord> AsEnumerable(this DbDataReader reader) { while (reader.Read()) { yield return reader; } } 稍后,我枚举每个记录并获取WRKORDNBR字段的值: foreach (var record in records)
public static IEnumerable<IDataRecord> AsEnumerable(this DbDataReader reader) {
while (reader.Read()) {
yield return reader;
}
}
稍后,我枚举每个记录并获取WRKORDNBR字段的值:
foreach (var record in records) {
DoSomething((int)record["WRKORDNBR"]);
}
这在以前很管用。现在,我费心转换DbDataReader的原因是,我需要在foreach块之前对记录执行LINQ查询。如您所知,DbDataReader中的记录只能枚举一次(或者我完全遗漏了什么)?这意味着我必须将AsEnumerable的结果复制到一个列表中,以便可以多次枚举它们
var temp = records.ToList();
至少,我认为这是我必须做的。但当我更改foreach循环以迭代临时集合时,我得到:
InvalidOperationException:行/列不存在任何数据
这里缺少什么?您的枚举表不包含不同的对象,但所有枚举都返回相同的实例(您的读取器)。您基本上正在执行以下操作:
var list = new List<IDataRecord>();
while (reader.Read())
{
list.Add(reader);
}
如果你有一个读卡器,但你想要一个数据集,数据集
如果您有一个数据集,但需要一个可查询的集合,请使用。那么我该如何解决这个问题?我应该怎么做?我想做的就是能够多次枚举DbDataReader的内容。然后您需要远离DataReader,因为它只允许您枚举一次。。。我建议您放弃DataReader,转而使用强类型,例如域模型,然后尽可能使用ORM或Linq2Sql(当然不是数据集)。不幸的是,我不能将ORM或Linq2Sql用于我必须与之交互的数据库系统。我想我已经决定枚举DataReader并在我自己的ToList扩展方法中构建一个List对象。
var list = new List<IDataRecord>();
while (reader.Read())
{
list.Add(reader);
}
while (reader.Read())
{
DoSomething((int)record["WRKORDNBR"]);
}