Странное исключение LINQ (индекс выходит за границы)

У меня есть столик, назовем Users. Эта таблица имеет единственный первичный ключ, определенный в SQL Server - автоинкремент int ID.

Иногда мои запросы LINQ к этой таблице завершаются ошибкой "Index was outside the range" - даже самые простые запросы. Сам запрос не использует никаких индексаторов.

Например:

User = Users.Take(1);

или же

IEnumerable<Users> = Users.ToList();

Оба запроса выдавали одну и ту же ошибку. Использование визуализатора отладчика для просмотра сгенерированного запроса - я копирую и вставляю запрос в 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 фактически идентичен.

Понятия не имею, что происходит, но интересно! Если ничего не помогает, вы можете попробовать список общих проектов Linq: форумы.microsoft.com/MSDN/…

Marc Gravell 10.10.2008 18:55

Было бы полезно, если бы мы могли увидеть определение таблицы.

KyleLanser 10.10.2008 19:03

(mssql -> Базы данных -> the_db -> Таблицы -> the_bad_table -> щелкните правой кнопкой мыши -> Таблица сценариев как -> Создать в)

KyleLanser 10.10.2008 19:05

Stacktrace показывает FirstOrDefault, но примеры кода не показывают этот метод. Пожалуйста, покажите код с помощью FirstOrDefault или подтвердите, что он не вызывается.

Amy B 10.10.2008 22:34

Пожалуйста, вставьте DBML и для этой таблицы (тип объекта) ... например, <Имя таблицы = "dbo.Container" ... <Тип ... <Столбец .... и т. д.

KristoferA 13.10.2008 10:29

Может быть такая же проблема: stackoverflow.com/questions/208533/…

Amy B 16.10.2008 18:05

Эта ошибка возникала у многих клиентов, только на машинах с Windows XP я нашел это оперативное исправление, которое решило проблему. i386: hotfixv4.microsoft.com/… x64: support.microsoft.com/hotfix/…

gpiccin 26.05.2013 00:17

Возможный дубликат Отладка LINQ to SQL SubmitChanges ()

B Faley 15.02.2017 14:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
8
8 413
5

Ответы 5

Исключение происходит в системной библиотеке, и ваша история заставляет меня думать, что проблема не в вашем коде. Схема менялась недавно? Ваше отображение правильное?

Схема не менялась в последнее время, хотя у меня довольно долго были проблемы. Я удалил таблицу виновных и снова добавил ее через браузер сервера, но безрезультатно.

Matt 10.10.2008 23:29

Я бы сказал, что у вас где-то модель -> несоответствие базы данных. Когда я так же отчаялся, как и вы, в подобных ситуациях, я обычно запускаю VS.NET, создаю новое консольное приложение, перестраиваю раздел DBML, который ссылается на интересующую сущность в этом запросе, и повторно запускаю. Вы можете обнаружить, что в такой изоляции запрос работает. Вы настраивали какие-либо определения своих сущностей, заполняя частичные методы, особенно те, которые запускаются при создании?

Это почти наверняка не будет основной причиной для всех, но я столкнулся с тем же самым исключением в своем проекте - и обнаружил, что основная причина заключалась в том, что исключение было выброшено во время создания класса сущности. Как ни странно, истинное исключение «потеряно» и вместо этого проявляется как исключение ArgumentOutOfRange, возникающее в итераторе оператора Linq, который извлекает объект / объекты.

Если вы получаете эту ошибку и ввели методы OnCreated или OnLoaded в свои POCO, попробуйте выполнить эти методы.

В самом деле, это еще один тип исключения, скрытый за пределами допустимого диапазона. В моем случае у меня была такая же проблема, и это было то, что объект, который я хотел изменить, находился в недопустимом контексте.

Hannish 17.01.2017 14:34

Эта проблема возникает из-за того, что объект 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);
}

В моем сценарии я передавал контекст данных в качестве параметра в более длинном стеке вызовов и попутно вызывал асинхронные методы. Так что это было не так очевидно, как в приведенном выше примере. Но, может быть, это все равно кому-то поможет :-)

Другие вопросы по теме