0

我有一个将 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:行/列不存在数据

我在这里想念什么?

4

2 回答 2

1

您的可枚举不包含不同的对象,但所有枚举都返回相同的实例(您的读者)。您基本上是在执行以下操作:

var list = new List<IDataRecord>();
while (reader.Read()) 
{
    list.Add(reader);
}

循环完成后,阅读器将不包含任何内容,这就是您查看列表中的任何“项目”时所得到的。如果您尝试停在倒数第二个项目,您还会看到它们都包含相同的值。

它在没有列表的情况下工作的原因是因为您正在执行以下操作:

while (reader.Read()) 
{
    DoSomething((int)record["WRKORDNBR"]);

}
于 2009-10-03T18:43:54.803 回答
0

如果您有阅读器,但需要数据集,请加载数据集...

如果您有数据集,但想要一个可查询的集合,请使用数据集扩展

于 2009-10-03T19:33:31.630 回答