使用ToList后,“行/列没有数据”异常

时间:2009-10-03 18:28:40

标签: c# .net linq ienumerable dbdatareader

我有一个扩展方法将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:行/列

不存在任何数据

我在这里缺少什么?

2 个答案:

答案 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