我有一张桌子,我们打电话Users
.此表具有在SQL Server中定义的单个主键 - 自动增量int ID
.
有时,我对该表的LINQ查询失败并出现"Index was outside the range"
错误 - 即使是最简单的查询.查询本身不使用任何索引器.
例如:
User = Users.Take(1);
要么
IEnumerable= Users.ToList();
两个查询都抛出了同样的错误.使用调试器Visualizer查看生成的查询 - 我在SQL中复制并粘贴查询,它工作正常.我也点击了可视化工具上的"执行",它工作正常.但是,执行代码本身会引发此错误.我没有在类上实现任何部分方法,因此没有任何事情发生.如果我重新启动我的调试器,问题就会消失,只是在几个小时之后再次随机地重新启动它.更重要的是,我在生产中运行的应用程序的错误日志中看到了这个错误.
我在我的应用程序中对我的数据库中的十几个不同实体进行了大量的LINQ,但我只在与表中的特定实体相关的查询中看到此问题.一些谷歌搜索表明这个问题可能与我的模型和另一个实体之间指定的错误关系有关,但我与此对象没有任何关系.它似乎在95%的时间工作,只是其他5%的失败.
我已经从设计器中完全删除了该对象,并从"刷新"的服务器浏览器中重新添加了该对象,但这并没有解决问题.
有什么想法在这里发生了什么?
这是完整的错误消息和堆栈跟踪:
指数超出范围.必须是非负数且小于集合的大小.参数名称:System.Data.Linq的System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询,QueryInfo queryInfo,IObjectReaderFactory工厂,Object [] parentArgs,Object [] userArgs,ICompiledSubQuery [] subQueries,Object lastResult)的索引System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute中的.SqlClient.SqlProvider.ExecuteAll(Expression query,QueryInfo [] queryInfos,IObjectReaderFactory factory,Object [] userArguments,ICompiledSubQuery [] subQueries) (表达式查询)
1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
在MyProject.FindUserByType(String typeId)的System.Data.Linq.Table 1 source,Expression`1谓词)
编辑:根据要求,下面是表模式的副本.
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()
.堆栈跟踪在所有这些之间是相同的,只是interchangnig FirstOrDefault/Take/ToList
.向下移动到堆栈SqlProvider.Execute
实际上是相同的.
这几乎肯定不是每个人的根本原因,但我在我的项目中遇到了这个完全相同的异常 - 并且发现根本原因是在构造实体类期间抛出异常.奇怪的是,真正的异常是"丢失",而是表现为一个ArgumentOutOfRange异常,它起源于检索对象的Linq语句的迭代器.
如果您收到此错误并且已在POCO上引入了OnCreated或OnLoaded方法,请尝试单步执行这些方法.