У меня есть столик, назовем 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.Table
1.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 фактически идентичен.
Было бы полезно, если бы мы могли увидеть определение таблицы.
(mssql -> Базы данных -> the_db -> Таблицы -> the_bad_table -> щелкните правой кнопкой мыши -> Таблица сценариев как -> Создать в)
Stacktrace показывает FirstOrDefault, но примеры кода не показывают этот метод. Пожалуйста, покажите код с помощью FirstOrDefault или подтвердите, что он не вызывается.
Пожалуйста, вставьте DBML и для этой таблицы (тип объекта) ... например, <Имя таблицы = "dbo.Container" ... <Тип ... <Столбец .... и т. д.
Может быть такая же проблема: stackoverflow.com/questions/208533/…
Эта ошибка возникала у многих клиентов, только на машинах с Windows XP я нашел это оперативное исправление, которое решило проблему. i386: hotfixv4.microsoft.com/… x64: support.microsoft.com/hotfix/…
Возможный дубликат Отладка LINQ to SQL SubmitChanges ()





Исключение происходит в системной библиотеке, и ваша история заставляет меня думать, что проблема не в вашем коде. Схема менялась недавно? Ваше отображение правильное?
Схема не менялась в последнее время, хотя у меня довольно долго были проблемы. Я удалил таблицу виновных и снова добавил ее через браузер сервера, но безрезультатно.
Я бы сказал, что у вас где-то модель -> несоответствие базы данных. Когда я так же отчаялся, как и вы, в подобных ситуациях, я обычно запускаю VS.NET, создаю новое консольное приложение, перестраиваю раздел DBML, который ссылается на интересующую сущность в этом запросе, и повторно запускаю. Вы можете обнаружить, что в такой изоляции запрос работает. Вы настраивали какие-либо определения своих сущностей, заполняя частичные методы, особенно те, которые запускаются при создании?
Это почти наверняка не будет основной причиной для всех, но я столкнулся с тем же самым исключением в своем проекте - и обнаружил, что основная причина заключалась в том, что исключение было выброшено во время создания класса сущности. Как ни странно, истинное исключение «потеряно» и вместо этого проявляется как исключение ArgumentOutOfRange, возникающее в итераторе оператора Linq, который извлекает объект / объекты.
Если вы получаете эту ошибку и ввели методы OnCreated или OnLoaded в свои POCO, попробуйте выполнить эти методы.
В самом деле, это еще один тип исключения, скрытый за пределами допустимого диапазона. В моем случае у меня была такая же проблема, и это было то, что объект, который я хотел изменить, находился в недопустимом контексте.
Эта проблема возникает из-за того, что объект 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);
}
В моем сценарии я передавал контекст данных в качестве параметра в более длинном стеке вызовов и попутно вызывал асинхронные методы. Так что это было не так очевидно, как в приведенном выше примере. Но, может быть, это все равно кому-то поможет :-)
Понятия не имею, что происходит, но интересно! Если ничего не помогает, вы можете попробовать список общих проектов Linq: форумы.microsoft.com/MSDN/…