Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 奇怪的LINQ异常(索引超出范围)_C#_Linq_Linq To Sql - Fatal编程技术网

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

C# 奇怪的LINQ异常(索引超出范围),c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有一张桌子,我们将呼叫用户。此表在SQL Server中定义了一个主键-一个自动增量int ID 有时,我对该表的LINQ查询失败,出现“索引超出范围”错误-即使是最简单的查询。查询本身不使用任何索引器 例如: User = Users.Take(1); 或 编辑:堆栈跟踪显示FirstOrDefault,但我使用Take()和ToList()复制了错误。所有这些堆栈之间的堆栈跟踪是相同的,只需在FirstOrDefault/Take/ToList之间进行切换即可。向下移动堆栈到SqlPro

我有一张桌子,我们将呼叫
用户
。此表在SQL Server中定义了一个主键-一个自动增量
int ID

有时,我对该表的LINQ查询失败,出现
“索引超出范围”
错误-即使是最简单的查询。查询本身不使用任何索引器

例如:

User = Users.Take(1);


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

异常发生在系统库中,您的故事让我认为问题不在您的代码中。模式最近有变化吗?您的映射正确吗?

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

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


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

出现此问题的原因是该表的linq对象和数据库字段不相同。

我也遇到了此问题并解决了它

现在我明白了错误是错误地使用Linq数据上下文,但也许我的经验可以帮助其他人理解为什么他们会出现这种错误

Linq数据上下文不适用于同时运行。因此,创建多个运行异步的任务并不理想。检查以下示例代码以了解问题:

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);
}
使用(var ctx=new LinqDataContext())
{
列表任务=新列表();
对于(int i=0;i{
var customer=ctx.Customers.SingleOrDefault(o=>o.Id==i);
customer.DoSomething();
}
任务。添加(任务);
}
Task.WaitAll(任务);
}

在我的场景中,我将数据上下文作为一个参数在一个较长的调用堆栈中传递,并在此过程中调用异步方法。因此,它不像上面的示例那样明显。但这可能会帮助其他人:-)

不知道发生了什么,但很有趣!如果所有其他方法都失败了,您可以尝试常规Linq项目列表:如果我们能够看到表定义,这可能会有所帮助。(mssql->数据库->表格->坏表格->右键单击->脚本表as->创建到)Stacktrace显示FirstOrDefault,但代码示例不显示此方法。请使用FirstOrDefault显示代码或确认未调用该代码。请同时粘贴此表(实体类型)的DBML。。。e、 这个模式最近没有改变,尽管我已经有相当一段时间没有解决这个问题了。我删除了罪魁祸首表,并通过服务器浏览器重新添加了它,但没有效果。事实上,这是另一种类型的异常隐藏在这个“超出范围”的异常中。在我的例子中,我也遇到了同样的问题,那就是我想要修改的对象处于无效的上下文中。
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]
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);
}