Urutan tidak mengandung elemen?


131

Saat ini saya menggunakan satu permintaan di dua tempat untuk mendapatkan baris dari basis data.

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

Kueri baik-baik saja ketika mengambil baris untuk memasukkan data ke kotak teks, tetapi mengembalikan kesalahan "Urutan tidak mengandung elemen" ketika digunakan untuk mengambil baris untuk mengeditnya dan memasukkannya kembali ke database. Saya tidak mengerti mengapa mungkin menemukan baris yang sesuai dalam satu contoh tetapi tidak yang lain.

(Menggunakan ASP.NET MVC dan LINQ)


18
Anda harus menggunakan SingleOrDefault, itu akan mengembalikan nol jika tidak ada barang kembali
Mahmoud Farahat

kesalahan mengatakan itu tidak dapat menemukan item di dc.BlogPosts yang cocok dengan nilai ID. Entah ID tidak memiliki nilai atau item dalam daftar Anda berisi item itu. Gunakan SingleOrDefault atau FirstOrDefault, ini akan mengembalikan objek nol jika tidak ada item jika ditemukan daripada kesalahan.
prd82

Jawaban:


32

Letakkan breakpoint pada baris itu, atau Debug.Cetak sebelum itu, dalam kedua kasus dan lihat apa yang berisi ID.


2
Melakukan itu dan menemukan bahwa, untuk beberapa alasan, ID dan tanggal diteruskan sebagai null \ new (0000-0000) dari halaman edit. Halaman ini diketik dengan kuat sebagai BlogPost. Pada halaman edit, saya hanya memiliki kotak teks untuk judul dan konten, ID dan tanggal tidak dimasukkan pada halaman sama sekali. Mungkinkah ini alasannya karena memberikannya sebagai null \ new?

2
Dari mana Anda mengharapkan ID berasal?
Ryan Lundy

8
Di mata belakang, aku benar-benar tidak yakin> _ <Masalah konyol sebenarnya.

367

Dari " Memperbaiki Kesalahan LINQ: Urutan tidak mengandung elemen ":

Ketika Anda mendapatkan kesalahan LINQ "Urutan tidak mengandung elemen", ini biasanya karena Anda menggunakan perintah First()atau Single()bukanFirstOrDefault() dan SingleOrDefault().

Ini juga dapat disebabkan oleh perintah berikut:

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

3
Ini memperbaiki masalah saya. Terima kasih untuk tautannya!
CountMurphy

5
Sempurna! ctx.Rosters.First(c => c.RosterAccess == accCode);<- rusak ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- BEKERJA
Ravi Ram

2
Dalam kasus saya, saya melakukan Maxurutan kosong
guzart

1
Jadi sekarang kita tahu bahwa setiap suara menimbang (saat ini) 31,25 pound.
B. Clay Shannon

2
Apakah Anda yakin itu LastOrDefault()juga dapat memicu kesalahan itu? Mengapa Saya pikir "OrDefault" adalah intinya
Robouste

22

Mohon gunakan

.FirstOrDefault()

karena jika di baris pertama hasilnya tidak ada info instruksi ini masuk ke info default.


2
Dalam kasus penggunaan panggilan async .FirstOrDefaultAsync ();
Andrea Girardi

12

Apa yang ada di IDsini? Secara khusus, apakah ini variabel lokal? Ada beberapa ruang lingkup / masalah penangkapan, yang berarti bahwa mungkin diinginkan untuk menggunakan salinan variabel kedua, hanya untuk kueri:

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

Juga; jika ini adalah LINQ-to-SQL, maka dalam versi saat ini Anda mendapatkan perilaku yang sedikit lebih baik jika Anda menggunakan formulir:

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

ID adalah GUID yang diteruskan sebagai argumen

10

Ini akan menyelesaikan masalah,

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

8

Selain semua hal lain yang telah dikatakan, Anda dapat menelepon DefaultIfEmpty()sebelum menelepon Single(). Ini akan memastikan bahwa urutan Anda berisi sesuatu dan dengan demikian menghindari InvalidOperationException "Urutan tidak mengandung elemen". Sebagai contoh:

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

2

Saya memiliki situasi yang serupa pada fungsi yang menghitung rata-rata.

Contoh:

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

Kasus Terpecahkan:

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

1

Alasan kesalahan:

  1. Kueri from p in dc.BlogPosts where p.BlogPostID == ID select pmengembalikan urutan.

  2. Single() mencoba mengambil elemen dari urutan yang dikembalikan pada langkah1.

  3. Sesuai pengecualian - Urutan yang dikembalikan pada langkah1 tidak mengandung elemen.

  4. Tunggal () mencoba mengambil elemen dari urutan yang dikembalikan pada langkah1 yang tidak mengandung elemen.

  5. Karena Single()tidak dapat mengambil elemen tunggal dari urutan yang dikembalikan pada langkah1, ia melempar kesalahan.

Memperbaiki:

Pastikan kueri (from p in dc.BlogPosts where p.BlogPostID == ID select p)

mengembalikan urutan dengan setidaknya satu elemen.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.