在查询结果上启动 foreach 循环时,“不存在数据时尝试读取无效”

本文关键字:数据 不存在 无效 读取 结果 查询 启动 循环 foreach | 更新日期: 2023-09-27 18:34:13

我有这个查询:

 // _db derives from DbContext
 var toProcess = from jobItem in _db.Jobs
                 where jobItem.State == desiredState
                 select jobItem.ItemId;
 foreach (Guid itemId in toProcess ) //exception thrown on this line
 {
     // whatever
 }

大多数情况下运行良好,但偶尔带有 foreach 的行会抛出:

系统无效操作异常:不存在数据时尝试读取无效

具有以下堆栈跟踪:

System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling[TColumn](Int32 ordinal)
System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()

这没有任何意义。我该如何解决此问题?

在查询结果上启动 foreach 循环时,“不存在数据时尝试读取无效”

根据您对我的评论的回复:

预计在 几秒钟,但我想可能需要更长的时间。你认为超时吗 发生?

我想这是超时或类似的东西。您可以增加超时,也可以强制它评估并存储在内存中以供以后处理。您可以通过在查询末尾添加ToArray()来执行此操作:

 var toProcess = (from jobItem in _db.Jobs
                 where jobItem.State == desiredState
                 select jobItem.ItemId).ToArray();

看看这是否有帮助。