繁体   English   中英

奇怪的LINQ异常(索引超出范围)

[英]Strange LINQ Exception (Index out of bounds)

我有一张桌子,我们叫Users 该表具有在SQL Server中定义的单个主键-自动增量int ID

有时,我对该表的LINQ查询失败,并显示"Index was outside the range"错误-甚至是最简单的查询。 查询本身不使用任何索引器。

例如:

User = Users.Take(1);

要么

IEnumerable<Users> = Users.ToList();

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

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

我已经从设计器中完全删除了该对象,然后从“刷新”服务器浏览器中重新添加了该对象,但这并不能解决问题。

有什么想法吗?

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

索引超出范围。 必须为非负数并且小于集合的大小。 参数名称:System.Data.Linq上System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询,QueryInfo queryInfo,IObjectReaderFactory工厂,Object [] parentArgs,Object [] userArgs,ICompiledSubQuery []子查询,Object lastResult)处的索引.SqlClient.SqlProvider.ExecuteAll(表达式查询,QueryInfo [] queryInfos,IObjectReaderFactory工厂,Object [] userArguments,ICompiledSubQuery []子查询)位于System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (表达式查询)在System.Data.Linq。表1中。System.Linq.IQueryProvider.Execute 1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1源,Expression`1谓词) 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方法,请尝试逐步执行这些方法。

我会说您有一个模型->数据库在某处不匹配。 当我在这种情况下感到绝望时,通常会启动VS.NET,创建一个新的控制台应用程序,然后重新构建DBML中引用此查询中所关注实体的部分,然后重新运行。 您可能会发现,在这种隔离中,查询有效。 您是否通过填写部分方法(尤其是在创建时触发的方法)来自定义任何实体定义?

由于linq对象而发生此问题,并且该表的数据库字段不相同。

异常发生在系统库中,您的故事使我认为问题不在您的代码中。 最近是否更改过架构? 您的映射正确吗?

我也遇到了这个问题并解决了。

现在,我知道该错误是对Linq Data Context的错误使用,但是也许我的经验仍然可以帮助其他人理解他们为什么会收到此错误。

Linq Data Context不能同时运行。 因此,创建多个运行异步任务是不理想的。 检查以下示例代码以了解问题:

using(var ctx = new LinqDataContext())
{
    List<Task> tasks = new List<Task>();
    for(int i=0;i<1000;i++)
    {
        var task = Task.Run(() => {
            var customer = ctx.Customers.SingleOrDefault(o => o.Id == i);
            customer.DoSomething();
        }
        tasks.Add(task);
    }
    Task.WaitAll(tasks);
}

在我的场景中,我将数据上下文作为参数传递给更长的调用堆栈,并在此过程中调用异步方法。 因此,它没有上面的示例那么明显。 但这也许可以帮助其他人:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM