Wyjątkowy wyjątek LINQ (indeks poza zakresem)
Mam stolik, zadzwonimyUsers
. Ta tabela zawiera pojedynczy klucz podstawowy zdefiniowany w SQL Server - przyrost automatycznyint ID
.
Czasami moje zapytania LINQ przeciwko tej tabeli kończą się niepowodzeniem"Index was outside the range"
błąd - nawet najprostsze zapytania. Samo zapytanie nie używa żadnych indeksatorów.
Na przykład:
User = Users.Take(1);
lub
IEnumerable<Users> = Users.ToList();
Oba zapytania rzuciły ten sam błąd. Używając Visualizera do debugera, spójrz na wygenerowane zapytanie - kopiuję i wklejam zapytanie w SQL i działa poprawnie. Klikam też „execute” na wizualizatorze i działa dobrze. Ale samo wykonanie kodu powoduje ten błąd. Nie implementuję żadnej z częściowych metod na klasie, więc nic się tam nie dzieje. Jeśli zrestartuję swój debugger, problem zniknie, tylko kilka godzin później ponownie wyląduję. Co ważniejsze, widzę ten błąd w dziennikach błędów aplikacji uruchomionej w produkcji.
Robię mnóstwo LINQ w mojej aplikacji, przeciwko kilkunastu różnym podmiotom w mojej bazie danych, ale widzę ten problem tylko w zapytaniach związanych z konkretną jednostką w mojej tabeli. Niektóre googlingi sugerują, że ten problem może być związany z niepoprawnym określeniem relacji między moim modelem a innym obiektem, ale nie mamkażdy relacje z tym obiektem. Wydaje się, że działa w 95% przypadków, tylko pozostałe 5% zawodzi.
Całkowicie usunąłem obiekt od projektanta i dodałem go ponownie z „odświeżonej” przeglądarki serwera, co nie rozwiązało problemu.
Jakieś pomysły, co tu się dzieje?
Oto pełny komunikat o błędzie i ślad stosu:
Indeks był poza zakresem. Musi być nieujemny i mniejszy niż rozmiar kolekcji. Nazwa parametru: index at System.Data.Linq.SqlClient.SqlProvider.Execute (zapytanie Expression, QueryInfo queryInfo, fabryka IObjectReaderFactory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subQueries, Object lastResult) w System.Data.Linq .SqlClient.SqlProvider.ExecuteAll (zapytanie o wyrażenie, QueryInfo [] queryInfos, fabryka IObjectReaderFactory, Object [] userArguments, ICompiledSubQuery [] podkwerendy) w System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (Zapytanie wyrażenia) w System.Data.Linq.Table1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
1 źródło, predykat Expression`1) w MyProject.FindUserByType (String typeId)
EDYCJA: Zgodnie z żądaniem poniżej znajduje się kopia schematu tabeli.
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: Pokazuje ślad stosuFirstOrDefault
, ale zduplikowałem błąd, używając obuTake()
iToList()
. Ślad stosu jest identyczny między tymi wszystkimi, po prostu interchangnigFirstOrDefault/Take/ToList
. Ruch w dół stosu doSqlProvider.Execute
jest w rzeczywistości identyczny.