我有一个扩展方法将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:行/列
不存在任何数据
我在这里缺少什么?
答案 0 :(得分:1)
您的枚举不包含不同的对象,但所有枚举都返回相同的实例(您的读者)。您基本上是在执行以下操作:
var list = new List<IDataRecord>();
while (reader.Read())
{
list.Add(reader);
}
循环结束后,阅读器不包含任何内容,如果您查看列表中的任何“项目”,则会获得此内容。如果你尝试停在倒数第二项,你也会看到它们都包含相同的值。
没有列表的原因是因为你正在做一些事情:
while (reader.Read())
{
DoSomething((int)record["WRKORDNBR"]);
}
答案 1 :(得分:0)
如果您有一个阅读器,但想要一个数据集,load数据集......
如果您有数据集,但想要可查询的集合,请使用dataset extensions。