Apa yang dikembalikan LINQ ketika hasilnya kosong

319

Saya punya pertanyaan tentang permintaan LINQ. Biasanya permintaan mengembalikan IEnumerable<T>tipe. Jika pengembaliannya kosong, tidak yakin apakah itu nol atau tidak. Saya tidak yakin apakah yang berikut ToList()akan melempar pengecualian atau hanya kosong List<string>jika tidak ada IEnumerablehasil yang ditemukan ?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Saya tahu ini adalah pertanyaan yang sangat sederhana, tetapi saya tidak memiliki VS untuk saat ini.

David.Chu.ca
sumber
11
Saya kira hasilnya Enumerable.Empty?
David.Chu.ca

Jawaban:

512

Ini akan mengembalikan enumerable kosong. Tidak akan null. Anda bisa tidur nyenyak :)

leppie
sumber
38

Anda juga dapat memeriksa .Any()metode ini:

if (!YourResult.Any())

Hanya catatan yang .Anymasih akan mengambil catatan dari database; melakukan .FirstOrDefault()/.Where()akan sama banyak overhead tetapi Anda kemudian akan dapat menangkap objek yang dikembalikan dari permintaan

Noich
sumber
5
Di mana pertanyaan menyebutkan database?
cja
4
Anda harus bertanya kepada orang yang diedit, saya tidak menyebutkan DB :)
Noich
Point editor membuat suara, meskipun, DB atau tidak. Saya percaya mereka katakan .Any()hanya akan memberi tahu Anda jika Anda memiliki catatan yang cocok, sama sekali, di mana melakukan permintaan aktual untuk menemukan nilai tertentu mungkin nol ketika .Any()tidak.
vapcguy
1
Hasil edit mungkin sebenarnya salah. Jika menggunakan linq ke entitas, db mungkin memotong ini dan tidak ada data sama sekali yang dikirim ke klien kecuali benar atau salah
Mafii
19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(Dump dari LinqPad )

JP Alioto
sumber
Persis! Anda mendapatkan indikasi yang lebih baik dari temuan
netfed
TIL Count()juga merupakan metode, bukan hanya properti
hei Sekarang
2
Tidakkah sebaiknya Anda menggunakan .Any () karena hitungan akan menyebutkan semua item?
SHEePYTaGGeRNeP
16

.ToList mengembalikan daftar kosong. (sama dengan Daftar baru ());

Paul van Brenk
sumber
8

Di Linq-to-SQL jika Anda mencoba untuk mendapatkan elemen pertama pada kueri tanpa hasil Anda akan mendapatkan sequence contains no elementskesalahan. Saya dapat meyakinkan Anda bahwa kesalahan yang disebutkan tidak sama dengan object reference not set to an instance of an object. dalam kesimpulan tidak, itu tidak akan mengembalikan nol karena nol tidak bisa mengatakan sequence contains no elementsitu akan selalu mengatakan object reference not set to an instance of an object;)

kay.one
sumber
1
Oh, penjelasan Anda membantu pemahaman lebih lanjut. Terima kasih !
Kay Lee
Apakah ini menjawab pertanyaan?
ChiefTwoPencils
7

Posting lain di sini telah memperjelas bahwa hasilnya adalah IQueryable "kosong", yang akan diubah ToList () menjadi daftar kosong dll.

Berhati-hatilah dengan beberapa operator, karena mereka akan membuang jika Anda mengirim mereka enumerable kosong. Ini bisa terjadi ketika Anda rantai mereka bersama.

Tempat menyimpan bahan makanan
sumber
3
"Berhati-hatilah dengan beberapa operator, karena mereka akan membuang jika Anda mengirim mereka enumerable kosong. Ini bisa terjadi ketika Anda rantai mereka bersama-sama." - Inilah yang membuat saya. Saya memiliki nilai pengembalian nol yang kemudian saya masukkan ke permintaan lain. Ini menyebabkan permintaan kedua untuk melempar tidak peduli apa yang saya masukkan karena tidak ada nilai yang dimasukkan ke dalam permintaan kedua.
trevorc
6

Itu tidak akan membuang pengecualian, Anda akan mendapatkan daftar kosong.

Jimmy Chandra
sumber