2012-08-03 27 views
24

Tôi đang cập nhật một số lượng trong giỏ hàng của mình, nhưng nó đang ném một Chuỗi không có phần tử 'ngoại lệ'.Xử lý 'Trình tự không có phần tử' Ngoại lệ

Và tôi không biết điều đó có nghĩa là gì. Lúc đầu, tôi nghĩ rằng có thể có một giá trị rỗng được chuyển đi đâu đó, nhưng đó không phải là trường hợp, vì tôi đã kiểm tra rằng:

Sequence contains no elements Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: Sequence contains no elements

Source Error:

Line 35: var uid = WebSecurity.CurrentUserId; Line 36: var newqty = Request.Form["Quantity"]; Line 37:
OModel.Cart c = (from item in database.Carts Line 38:
where item.UserId == uid && item.PartNumber == pnumber && item.OrderId == oid Line 39: select item).First();

Bất kỳ ý tưởng nào có thể gây ra điều này?

+1

Bạn có thể muốn đọc http://stackoverflow.com/questions/1024559/when-to-use-first-and-when-to-use-firstordefault-with-linq/1024577#1024577 – driis

+0

@driss I ' đã sử dụng FirstOrDefault() khi nó được sử dụng, nhưng khi tôi muốn tìm hiểu cách cập nhật, tôi đã tìm thấy một blog (cùng một blog mà tôi đã học cách thêm và xóa) - và anh ấy đã sử dụng Đầu tiên thay vì FirstOrDefault(), vì vậy tôi đã sử dụng nó thay thế. Nhưng FirstOrDefault() ném một ngoại lệ khác. Vì vậy, tôi đã không chắc chắn nên sử dụng cái nào, hoặc nếu nó thậm chí còn quan trọng, trong trường hợp này. – Arrow

Trả lời

53

First() đang gây ra điều này nếu lựa chọn của bạn trả về 0 hàng. Bạn phải nắm bắt ngoại lệ đó hoặc sử dụng FirstOrDefault() sẽ trả về giá trị rỗng trong trường hợp không có phần tử nào.

+0

Cảm ơn bạn. Điều đó có ý nghĩa. Tôi tự hỏi, mặc dù tại sao nó sẽ trở về _NULL_ - ngay cả sau khi tôi đã kiểm tra rằng nó thực sự tồn tại trong cơ sở dữ liệu? Bạn có biết bất kỳ cách nào khác để cập nhật mục trong bảng không? – Arrow

+0

Bạn có thể tạo Thủ tục lưu sẵn, ánh xạ nó trong LINQ và gọi nó thay thế. Nhưng tôi không thấy lý do tại sao điều này sẽ không hoạt động, miễn là tất cả các tham số đều ổn. Bạn có thể thử sử dụng Sql Profiler để xem lệnh SQL nào được thực thi. Điều đó sẽ giúp tìm ra điều gì sai. – Varius

+2

nếu nó thực sự tồn tại trong cơ sở dữ liệu và nó không được trả về sau đó nó không đáp ứng các điều kiện. bạn có sử dụng UserId == uid && PartNumber == pnumber && OrderId == oid tất cả đều đúng không? bạn đang kiểm tra đúng loại? – c0deNinja

4

Thay vì .First() thay đổi nó để .FirstOrDefault()

9

Bạn đang sử dụng phương pháp LINQ của First(), mà as per the documentation ném một InvalidOperationException nếu bạn đang gọi nó trên một bộ sưu tập trống.

Nếu bạn mong đợi kết quả truy vấn của bạn trống đôi khi, bạn có thể muốn sử dụng FirstOrDefault(), sẽ trả về null nếu bộ sưu tập trống, thay vì ném một ngoại lệ.

0

Giá trị là null, bạn phải kiểm tra lý do tại sao ... (ngoài việc thực hiện các giải pháp đề xuất ở đây)

Kiểm tra các kết nối phần cứng.