c# - 奇怪的 LINQ 异常(索引越界)

标签 c# linq linq-to-sql

我有一张 table ,我们称之为Users。此表具有在 SQL Server 中定义的单个主键 - 一个自动增量 int ID

有时,我针对此表的 LINQ 查询会失败并出现 “Index was outside the range” 错误 - 即使是最简单的查询也是如此。查询本身不使用任何索引器。

例如:

User = Users.Take(1);

IEnumerable<Users> = Users.ToList();

这两个查询都抛出了同样的错误。使用调试器 Visualizer 查看生成的查询 - 我将查询复制并粘贴到 SQL 中,它工作正常。我还在可视化工具上单击“执行”,它工作正常。但是单独执行代码会引发此错误。我没有在类上实现任何部分方法,所以那里什么也没有发生。如果我重新启动我的调试器,问题就会消失,只是在几个小时后再次随机出现。更严重的是,我在生产环境中运行的应用程序的错误日志中看到了这个错误。

我在我的应用程序中针对我的数据库中的十几个不同的实体执行了大量的 LINQ,但我只在与我的表中的特定实体相关的查询中看到这个问题。一些谷歌搜索表明此问题可能与我的模型和另一个实体之间指定的不正确关系有关,但我与该对象没有任何关系。它似乎 95% 的时间都在工作,只是另外 5% 的时间失败了。

我已经从设计器中完全删除了该对象,并从“刷新的”服务器浏览器中重新添加了它,但并没有解决问题。

知道这里发生了什么吗?

这是完整的错误消息和堆栈跟踪:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.Table1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 source, Expression`1 predicate) at MyProject.FindUserByType(String typeId)

编辑:根据要求,下面是表架构的副本。

CREATE TABLE [dbo].[Container](
[ID] [int] IDENTITY(1,1) NOT NULL,
[MarketCode] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Description] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Capacity] [int] NOT NULL,
[Volume] [float] NOT NULL
 CONSTRAINT [PK_Container] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

编辑:堆栈跟踪显示 FirstOrDefault,但我使用 Take()ToList() 复制了错误。所有这些之间的堆栈跟踪是相同的,只是简单地交换 FirstOrDefault/Take/ToList。向下移动堆栈到 SqlProvider.Execute 实际上是相同的。

最佳答案

这几乎肯定不会是每个人的根本原​​因,但我在我的项目中遇到了完全相同的异常 - 并发现根本原因是在构造实体类期间抛出异常。奇怪的是,真正的异常是“丢失”的,而是表现为 ArgumentOutOfRange 异常,该异常源自检索对象的 Linq 语句的迭代器。

如果您收到此错误并且您在 POCO 上引入了 OnCreated 或 OnLoaded 方法,请尝试单步执行这些方法。

关于c# - 奇怪的 LINQ 异常(索引越界),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/191690/

相关文章:

c# - IEnumerable<string> => 独特的字符串[]

linq-to-sql - LINQ 多对多 hell - 查询 CONTAINS ALL

c# - 使用 linq 或 subsonic 计算距离

c# - 基于另一个列表过滤列表 - LINQ

c# - MongoDB 创建动态查询

c# - 如何在 C# 中将递归对象转换为集合?

C# 正则表达式分割字符串并在分割中包含匹配的表达式

c# - 如何按多个值对 XML 数据进行分组

c# - ASP.NET GridView - 控件在内容页面中移动

c# - LINQ:System.Int32 是不可为 null 的值类型