2008-10-10 37 views
10

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()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.

+0

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 –

+0

Nó có thể giúp đỡ nếu chúng ta có thể xem định nghĩa bảng. – KyleLanser

+0

(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

Trả lời

0

Trường hợp ngoại lệ xảy ra trong thư viện Hệ thống và câu chuyện của bạn khiến tôi nghĩ rằng sự cố không nằm trong mã của bạn. Lược đồ đã thay đổi gần đây chưa? Bản đồ của bạn có đúng không?

+0

Giản đồ không thay đổi gần đây, mặc dù tôi đã gặp vấn đề trong một thời gian khá dài. Tôi đã xóa bảng thủ phạm và thêm lại nó thông qua trình duyệt máy chủ, không có kết quả. – Matt

1

Tôi sẽ nói rằng bạn đã có mô hình -> cơ sở dữ liệu không khớp ở đâu đó. Khi tôi tuyệt vọng như bạn trong tình huống như thế này, tôi thường kích hoạt VS.NET, tạo một ứng dụng giao diện điều khiển mới và xây dựng lại phần của DBML tham chiếu đến thực thể quan tâm trong truy vấn này và chạy lại. Bạn có thể thấy rằng trong loại phân lập này, truy vấn hoạt động. Bạn đã tùy chỉnh bất kỳ định nghĩa đối tượng nào của mình bằng cách điền vào các phương thức từng phần, đặc biệt là các phương thức kích hoạt trên tạo?

-1

Shot trong bóng tối:

Bạn đang kêu gọi MyProject.FindUserByType (String typeid) bên trong một thân vòng lặp, sử dụng biến vòng lặp như các tham số.

Không sử dụng biến vòng lặp trực tiếp.

foreach(string s in myTypeList) 
{ 
    //GetUserByType(s); //Ooo, bad 
    string tempstring = s; 
    GetUserByType(tempstring); 
} 

Nếu điều này xảy ra, tôi sẽ cập nhật câu trả lời này để giải thích lý do sử dụng biến vòng trực tiếp là xấu (sau khi bạn cập nhật câu hỏi để hiển thị vòng lặp).

+0

Đây là nơi tôi đã thấy chỉ mục nằm ngoài phạm vi và LINQ to SQL trước http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3782912&SiteID=1 –

+0

Xin chào David. Tôi không, trên thực tế, làm bất kỳ vòng lặp nào. Tôi giả sử những gì bạn đang đề cập đến là việc thực hiện trì hoãn truy vấn có thể dẫn đến một giá trị khác được sử dụng so với dự định ban đầu, vì nó đã thay đổi trong vòng lặp. Đó là một điểm thú vị, vì nó đã không xảy ra với tôi. – Matt

5

Điều này gần như chắc chắn sẽ không phải là nguyên nhân gốc rễ của mọi người, nhưng tôi đã gặp phải ngoại lệ chính xác này trong dự án của tôi - và thấy rằng nguyên nhân gốc là một ngoại lệ đã được ném trong khi xây dựng một lớp thực thể. Kỳ lạ thay, ngoại lệ thực sự là "bị mất" và thay vào đó biểu hiện dưới dạng ngoại lệ ArgumentOutOfRange bắt nguồn từ trình lặp của câu lệnh Linq để truy lục đối tượng/s.

Nếu bạn nhận được lỗi này và bạn đã giới thiệu phương pháp OnCreated hoặc OnLoaded trên POCO của bạn, hãy thử bước qua các phương pháp đó.

+0

Thật vậy, đó là một loại ngoại lệ khác được ẩn bởi "ngoài phạm vi" này. Trong trường hợp của tôi, tôi đã có cùng một vấn đề và đó là đối tượng tôi muốn sửa đổi trong một ngữ cảnh không hợp lệ. – Hannish

0

Vấn đề này Xảy ra do đối tượng LINQ và trường cơ sở dữ liệu của bảng đó không giống nhau.

0

Tôi cũng có Vấn đề này và giải quyết vấn đề.

Bây giờ tôi hiểu lỗi đã sử dụng sai Ngữ cảnh dữ liệu LINQ, nhưng có lẽ trải nghiệm của tôi vẫn có thể giúp người khác hiểu tại sao họ gặp phải lỗi này.

Ngữ cảnh dữ liệu LINQ không có nghĩa là chạy đồng thời. Do đó việc tạo nhiều tác vụ chạy async không phải là lý tưởng. Kiểm tra mã mẫu sau đây để hiểu vấn đề:

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); 
} 

Trong trường hợp của tôi, tôi đã chuyển ngữ cảnh dữ liệu dưới dạng tham số trong ngăn xếp cuộc gọi lâu hơn và gọi các phương thức không đồng bộ trên đường đi. Vì vậy, nó không rõ ràng như ví dụ trên. Nhưng có lẽ điều này có thể giúp đỡ người khác bằng cách nào đó :-)

Các vấn đề liên quan