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.


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

Jawaban:


512

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


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


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 )


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


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


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.


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

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.