Tôi có một bảng, chúng tôi sẽ gọi Users
. Bảng này có một khóa chính được xác định trong SQL Server - một autoincrement int ID
.Ngoại lệ LINQ lạ (Chỉ số ngoài giới hạn)
Đôi khi, truy vấn LINQ của tôi đối với bảng này không thành công với lỗi "Index was outside the range"
- ngay cả những truy vấn đơn giản nhất. Bản thân truy vấn không sử dụng bất kỳ người lập chỉ mục nào.
Ví dụ:
User = Users.Take(1);
hoặc
IEnumerable<Users> = Users.ToList();
Cả hai truy vấn ném lỗi tương tự. Sử dụng trình gỡ rối Visualizer để xem xét truy vấn được tạo ra - tôi sao chép và dán truy vấn trong SQL và nó hoạt động tốt. Tôi cũng bấm vào "thực hiện" trên visualizer và nó hoạt động tốt. Nhưng việc thực thi mã bằng chính nó sẽ ném lỗi này. Tôi không thực hiện bất kỳ phương pháp một phần nào trên lớp, vì vậy không có gì xảy ra ở đó. Nếu tôi khởi động lại trình gỡ rối của mình, sự cố sẽ biến mất, chỉ để lùi lại sau một vài lần sau đó một cách ngẫu nhiên. Nghiêm trọng hơn, tôi thấy lỗi này trong các bản ghi lỗi của tôi từ ứng dụng đang chạy trong sản xuất.
Tôi thực hiện một tấn LINQ trong ứng dụng của mình, so với hàng chục thực thể khác nhau trong cơ sở dữ liệu của tôi, nhưng tôi chỉ thấy vấn đề này trên các truy vấn liên quan đến một thực thể cụ thể trong bảng của tôi. Một số googling đã gợi ý rằng sự cố này có thể liên quan đến mối quan hệ không chính xác được chỉ định giữa mô hình của tôi và một thực thể khác, nhưng tôi không có bất kỳ mối quan hệ nào với đối tượng này. Có vẻ như nó đang hoạt động 95% thời gian, nó chỉ là 5% khác thất bại.
Tôi đã xóa hoàn toàn đối tượng khỏi trình thiết kế và thêm lại đối tượng đó từ trình duyệt máy chủ "được làm mới" và điều đó không khắc phục được sự cố.
Bất kỳ ý tưởng gì đang xảy ra ở đây?
Đây là đầy đủ thông báo lỗi và stack trace:
Index đã ra khỏi phạm vi. Phải không âm và nhỏ hơn kích thước của bộ sưu tập. Tên tham số: chỉ số tại System.Data.Linq.SqlClient.SqlProvider.Execute (query Expression, QueryInfo queryInfo, nhà máy IObjectReaderFactory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subqueries, Object LASTRESULT) tại System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (truy vấn biểu thức, QueryInfo [] queryInfos, IObjectReaderNhà máy sản xuất, Object [] userArguments, ICompiledSubQuery [] subQueries) tại System.Data.Linq.SqlClient.SqlProvider.System.Data .Linq.Provider.IProvider.Execute (Biểu thức truy vấn) tại System.Data.Linq.Table
1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
1 source, Expression`1 predicate) tại MyProject.FindUserByType (String typeId)
EDIT: Theo yêu cầu, bên dưới là bản sao của lược đồ bảng.
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: Các vết đống lãm FirstOrDefault
, nhưng tôi lặp lại các lỗi sử dụng cả hai Take()
và ToList()
. Dấu vết ngăn xếp giống hệt nhau giữa tất cả những điều này, chỉ cần hoán đổi cho nhau FirstOrDefault/Take/ToList
. Việc di chuyển xuống ngăn xếp đến SqlProvider.Execute
thực ra là giống hệt nhau.
Không có ý tưởng về những gì đang xảy ra, nhưng hấp dẫn! Nếu thất bại, bạn có thể thử danh sách General Linq Project: http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=123&SiteID=1 –
Nó có thể giúp đỡ nếu chúng ta có thể xem định nghĩa bảng. – KyleLanser
(mssql -> Cơ sở dữ liệu -> the_db -> Bảng -> the_bad_table -> nhấp chuột phải -> Bảng Script dưới dạng -> Tạo thành) – KyleLanser