我有一张表格,我们称其为Users
。在SQL Server中,这个表格只定义了一个自增的主键int ID
。
有时,我的针对这个表格的LINQ查询会因为一个"Index was outside the range"
错误而失败——即使是最简单的查询。查询本身没有使用任何索引器。
例如:
User = Users.Take(1);
或者IEnumerable<Users> = Users.ToList();
这两个查询都产生了相同的错误。使用调试器 Visualizer 查看生成的查询 - 我复制并粘贴 SQL 查询,它可以正常工作。我还在可视化程序中点击“执行”,也能正常工作。但是,单独执行代码会抛出此错误。我没有在类上实现任何部分方法,因此那里什么都没有发生。如果我重新启动调试器,问题就消失了,只有在几个小时后不定时地重新出现。更为关键的是,我在运行中的应用程序的错误日志中看到了这个 bug。我的应用程序中做了大量的 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.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 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
的操作实际上是相同的。