Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“行/列”不存在任何数据;使用ToList后出现异常_C#_.net_Linq_Ienumerable_Dbdatareader - Fatal编程技术网

C# &引用;“行/列”不存在任何数据;使用ToList后出现异常

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)

我有一个扩展方法将DbDataReader转换为IEnumerable对象:

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"]);

}