Trình tự không chứa các yếu tố?


131

Tôi hiện đang sử dụng một truy vấn duy nhất ở hai nơi để lấy một hàng từ cơ sở dữ liệu.

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();

Truy vấn vẫn ổn khi truy xuất hàng để đưa dữ liệu vào hộp văn bản, nhưng nó trả về lỗi "Trình tự không chứa phần tử" khi được sử dụng để truy xuất hàng để chỉnh sửa và đưa nó trở lại cơ sở dữ liệu. Tôi không thể hiểu tại sao nó có thể tìm thấy một hàng thích hợp trong một trường hợp chứ không phải một hàng khác.

(Sử dụng ASP.NET MVC và LINQ)


18
bạn phải sử dụng SingleOrDefault, nó sẽ trả về null nếu không có mục nào được trả về
Mahmoud Farahat

lỗi là nó không thể tìm thấy bất kỳ mục nào trong dc.BlogPost phù hợp với giá trị của ID. ID không có giá trị hoặc các mục trong danh sách của bạn chứa mục đó. Sử dụng SingleOrDefault hoặc FirstOrDefault, những thứ này sẽ trả về một đối tượng null nếu không có mục nào nếu tìm thấy thay vì lỗi.
prd82

Câu trả lời:


32

Đặt một điểm dừng trên dòng đó hoặc Debug.Print trước nó, trong cả hai trường hợp và xem ID chứa gì.


2
Đã làm điều đó và thấy rằng, vì một số lý do, ID và ngày đang được chuyển thành null \ new (0000-0000) từ trang chỉnh sửa. Trang được gõ mạnh là BlogPost. Trên trang chỉnh sửa, tôi chỉ có hộp văn bản cho tiêu đề và nội dung, ID và ngày không được đặt trên trang. Đây có thể là lý do cho việc vượt qua chúng dưới dạng null \ new không?

2
Bạn đang mong đợi ID đến từ đâu?
Ryan Lundy

8
Trước mắt, tôi thực sự không chắc chắn> _ <Vấn đề ngớ ngẩn thực sự.

367

Từ " Sửa lỗi LINQ: Trình tự không chứa phần tử ":

Khi bạn gặp lỗi LINQ "Chuỗi không chứa phần tử", điều này thường là do bạn đang sử dụng lệnh First()hoặc Single()thay vì FirstOrDefault()SingleOrDefault().

Điều này cũng có thể được gây ra bởi các lệnh sau:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

3
Điều này đã khắc phục vấn đề của tôi. Cảm ơn các liên kết!
CountMurphy

5
Hoàn hảo! ctx.Rosters.First(c => c.RosterAccess == accCode);<- hỏng ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- LÀM VIỆC
Ravi Ram

2
Trong trường hợp của tôi, tôi đã thực hiện một Maxchuỗi trống
guzart

1
Vì vậy, bây giờ chúng tôi biết rằng mỗi phiếu bầu lên nặng (tại thời điểm này) 31,25 bảng.
B. Clay Shannon

2
Bạn có chắc chắn LastOrDefault()cũng có thể kích hoạt lỗi đó? Tại sao ? Tôi nghĩ rằng "OrDefault" là tất cả các điểm
Robouste

22

Vui lòng sử dụng

.FirstOrDefault()

bởi vì nếu trong hàng đầu tiên của kết quả không có thông tin thì hướng dẫn này sẽ đi đến thông tin mặc định.


2
Trong trường hợp cuộc gọi không đồng bộ, hãy sử dụng .irstirstDefDefAsync ();
Andrea Girardi

12

Chà, cái gì IDở đây? Cụ thể, nó là một biến cục bộ? Có một số vấn đề phạm vi / chụp, có nghĩa là có thể muốn sử dụng bản sao biến thứ hai, chỉ cho truy vấn:

var id = ID;
BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == id
                 select p).Single();

Cũng thế; nếu đây là LINQ-to-SQL, thì trong phiên bản hiện tại bạn sẽ có hành vi tốt hơn một chút nếu bạn sử dụng biểu mẫu:

var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);

ID là một GUID được thông qua dưới dạng đối số

10

Điều này sẽ giải quyết vấn đề,

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}

8

Ngoài mọi thứ khác đã được nói, bạn có thể gọi DefaultIfEmpty()trước khi gọi Single(). Điều này sẽ đảm bảo rằng chuỗi của bạn chứa một cái gì đó và do đó thay đổi "Trình tự không hợp lệ" Trình tự không chứa các phần tử ". Ví dụ:

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();

2

Tôi đã có một tình huống tương tự trên một hàm tính trung bình.

Thí dụ:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

Vụ án được giải quyết:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

1

Lý do lỗi:

  1. Truy vấn from p in dc.BlogPosts where p.BlogPostID == ID select ptrả về một chuỗi.

  2. Single() cố gắng lấy một phần tử từ chuỗi được trả về trong bước 1.

  3. Theo ngoại lệ - Chuỗi được trả về trong bước 1 không chứa phần tử.

  4. Single () cố gắng truy xuất một phần tử từ chuỗi được trả về trong bước 1 không chứa phần tử nào.

  5. Single()không thể tìm nạp một phần tử từ chuỗi được trả về trong bước 1, nên nó sẽ báo lỗi.

Sửa chữa:

Đảm bảo truy vấn (from p in dc.BlogPosts where p.BlogPostID == ID select p)

trả về một chuỗi có ít nhất một phần tử.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.