У меня есть таблица, мы назовем Users
. В этой таблице есть один первичный ключ, определенный в SQL Server - автоинкремент int ID
.Странное исключение LINQ (указатель за пределы)
Иногда мои запросы LINQ против этой таблицы терпят неудачу с ошибкой "Index was outside the range"
- даже самый простой из запросов. Сам запрос не использует никаких индексов.
Например:
User = Users.Take(1);
или
IEnumerable<Users> = Users.ToList();
Оба запросов бросил ту же ошибку. Использование отладчика Visualizer для просмотра сгенерированного запроса - я копирую и вставляю запрос в SQL, и он отлично работает. Я также нажимаю «выполнить» на визуализаторе, и он отлично работает. Но выполнение кода само по себе вызывает эту ошибку. Я не реализую никаких частичных методов в классе, поэтому там ничего не происходит. Если я перезапущу свой отладчик, проблема исчезнет, и только через несколько часов он снова запустит голову. Более критически, я вижу эту ошибку в своих журналах ошибок из приложения, работающего на производстве.
Я использую тонну LINQ в моем приложении, против дюжины разных объектов в моей базе данных, но я вижу эту проблему только в запросах, связанных с определенным объектом в моей таблице. Некоторые поисковые запросы предположили, что эта проблема может быть связана с неправильной связью, указанной между моей моделью и другим объектом, но у меня нет любых связей с этим объектом. Кажется, что он работает в 95% случаев, а остальные 5% терпят неудачу.
Я полностью удалил объект от дизайнера и повторно добавил его из «обновленного» браузера сервера, и это не устранило проблему.
Любые идеи, что здесь происходит?
Вот полное сообщение об ошибке и трассировку стека:
Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс в System.Data.Linq.SqlClient.SqlProvider.Execute (выражение запроса QueryInfo QueryInfo, IObjectReaderFactory фабрики, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] подзапросов, объект lastResult) в System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (Выражение запроса, QueryInfo [] queryInfos, IObjectReaderFactory завод, Object [] userArguments, ICompiledSubQuery [] подзапросов) в System.Data.Linq.SqlClient.SqlProvider.System.Data .Linq.Provider.IProvider.Execute (выражение query) в System.Data.Linq.Table
1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
1 источник, Предикат Expression`1) в MyProject.FindUserByType (String typeId)
EDIT: В соответствии с запросом ниже приведена копия схемы таблицы.
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()
. Трассировка стека идентична между всеми этими, просто interchangnig FirstOrDefault/Take/ToList
. Переход вниз по стеку до SqlProvider.Execute
на самом деле идентичен.
Не знаю, что происходит, но увлекательно! Если все остальное не удается, вы можете попробовать общий список проектов Linq: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=123&SiteID=1 – 2008-10-10 14:55:01
Это может помочь, если мы сможем увидеть определение таблицы. – KyleLanser 2008-10-10 15:03:47
(mssql -> Базы данных -> the_db -> Таблицы -> the_bad_table -> щелкните правой кнопкой мыши -> Таблица скриптов as -> Create To) – KyleLanser 2008-10-10 15:05:33