У меня есть стол, мы позвоним 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
фактически идентично.