Странное исключение LINQ (индекс вне границ) - PullRequest
10 голосов
/ 10 октября 2008

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

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

Например:

User = Users.Take(1);

или

IEnumerable<Users> = Users.ToList();

Оба запроса выдали одну и ту же ошибку. С помощью отладчика Visualizer для просмотра сгенерированного запроса - я копирую и вставляю запрос в SQL, и он работает нормально. Я также нажимаю «выполнить» на визуализаторе, и он отлично работает. Но выполнение кода само по себе выдает эту ошибку. Я не реализую какие-либо частичные методы в классе, поэтому там ничего не происходит. Если я перезагружаю свой отладчик, проблема исчезает, но через несколько часов случайно снова поднимает голову. Что еще более важно, я вижу эту ошибку в моих журналах ошибок из приложения, запущенного в производство.

Я использую тонну LINQ в своем приложении против дюжины или около того разных сущностей в моей базе данных, но я вижу эту проблему только в запросах, связанных с определенной сущностью в моей таблице. Некоторые специалисты по поиску в Google предположили, что эта проблема может быть связана с неправильными отношениями, указанными между моей моделью и другим объектом, но у меня нет каких-либо отношений с этим объектом. Кажется, он работает в 95% случаев, просто остальные 5% терпят неудачу.

Я полностью удалил объект из конструктора и повторно добавил его из «обновленного» браузера сервера, но это не устранило проблему.

Есть идеи, что здесь происходит?

Вот полное сообщение об ошибке и трассировка стека:

Индекс был вне диапазона. Должен быть неотрицательным и меньше размера Коллекция. Имя параметра: индекс на System.Data.Linq.SqlClient.SqlProvider.Execute (запрос выражения, QueryInfo queryInfo, IObjectReaderFactory factory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subQueries, Object lastResult) в System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (запрос выражения, QueryInfo [] queryInfos, фабрика IObjectReaderFactory, Object [] userArguments, ICompiledSubQuery [] subQueries) в System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (Expression запрос) в Источник System.Data.Linq.Table 1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1, Предикат выражения `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]

EDIT: трассировка стека показывает FirstOrDefault, но я продублировал ошибку, используя Take() и ToList(). Трассировка стека идентична всем этим, просто взаимозаменяемость FirstOrDefault/Take/ToList. Перемещение вниз по стеку к SqlProvider.Execute фактически идентично.

Ответы [ 6 ]

5 голосов
/ 04 августа 2009

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

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

1 голос
/ 11 октября 2008

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

0 голосов
/ 16 февраля 2016

У меня тоже был этот вопрос, и я решил его.

Теперь я понимаю, что ошибка была неверной при использовании 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);
}

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

0 голосов
/ 24 июня 2013

Эта проблема возникает из-за того, что объекты linq и поля базы данных этой таблицы не идентичны.

0 голосов
/ 11 октября 2008

Снято в темноте:

Вы вызываете MyProject.FindUserByType (String typeId) внутри тела цикла, используя переменную цикла в качестве параметра.

Не используйте переменную цикла напрямую.

foreach(string s in myTypeList)
{
  //GetUserByType(s);  //Ooo, bad
  string tempstring = s;
  GetUserByType(tempstring); 
}

Если это так, я обновлю этот ответ, чтобы объяснить, почему прямое использование переменных цикла является плохой практикой (после того, как вы обновите вопрос, чтобы показать цикл).

0 голосов
/ 10 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...