Saya telah mencari-cari dan belum benar-benar menemukan jawaban yang jelas kapan Anda ingin menggunakan .First
dan kapan Anda ingin menggunakannya .FirstOrDefault
dengan LINQ.
Kapan Anda ingin menggunakannya
.First
? Hanya ketika Anda ingin menangkap pengecualian jika tidak ada hasil yang dikembalikan?var result = List.Where(x => x == "foo").First();
Dan kapan Anda ingin menggunakannya
.FirstOrDefault
? Kapan Anda selalu ingin jenis default jika tidak ada hasil?var result = List.Where(x => x == "foo").FirstOrDefault();
Dan dalam hal ini, bagaimana dengan Take?
var result = List.Where(x => x == "foo").Take(1);
.First
dan.FirstOrDefault
keduanya mengambil predikat sebagai argumen, sehinggavar result = List.Where(x => x == "foo").First();
dapat ditulis ulang sebagaivar result = List.First(x => x == "foo");
Single
danSingleOrDefault
. Saya benci ketika orang menggunakanFirst
ketika mereka benar-benar berartiSingle
; ).FirstOrDefault()
selalu memberi Anda kesempatan untuk melemparkan pengecualian yang lebih bermakna. Jika pengecualian urutan dilemparkan dan lebih dari satu.First()
dalam suatu metode, mungkin sulit untuk membedakan pernyataan mana yang menjadi masalah.Jawaban:
Saya akan menggunakan
First()
ketika saya tahu atau mengharapkan urutan memiliki setidaknya satu elemen. Dengan kata lain, ketika itu adalah kejadian luar biasa bahwa urutannya kosong.Gunakan
FirstOrDefault()
ketika Anda tahu bahwa Anda perlu memeriksa apakah ada elemen atau tidak. Dengan kata lain, saat legal urutannya kosong. Anda tidak harus bergantung pada penanganan pengecualian untuk cek. (Ini adalah praktik buruk dan mungkin merusak kinerja).Akhirnya, perbedaan antara
First()
danTake(1)
adalah yangFirst()
mengembalikan elemen itu sendiri, sementaraTake(1)
mengembalikan urutan elemen yang persis mengandung satu elemen.sumber
.First
akan melempar pengecualian ketika tidak ada hasil..FirstOrDefault
tidak akan, itu hanya akan mengembalikan null (tipe referensi) atau nilai default dari tipe nilai. (mis. suka0
untuk int.) Pertanyaan di sini bukanlah kapan Anda menginginkan jenis default, tetapi lebih: Anda bersedia menangani pengecualian atau menangani nilai default? Karena pengecualian harus luar biasa,FirstOrDefault
lebih disukai bila Anda tidak yakin apakah Anda akan mendapatkan hasil dari permintaan Anda. Ketika secara logis data harus ada di sana, penanganan pengecualian dapat dipertimbangkan.Skip()
danTake()
biasanya digunakan ketika mengatur paging dalam hasil. (Seperti menampilkan 10 hasil pertama, dan 10 berikutnya di halaman berikutnya, dll.)Semoga ini membantu.
sumber
.FirstOrDefault
akan mengembalikan nol untuk jenis referensi. Saya bingung tentang apa yang akan menjadi objek "default". Jawaban ini menjelaskannya..First()
akan mengeluarkan pengecualian jika tidak ada baris yang dikembalikan, sementara.FirstOrDefault()
akan mengembalikan nilai default (NULL
untuk semua jenis referensi) sebagai gantinya.Jadi, jika Anda siap dan bersedia menangani kemungkinan pengecualian,
.First()
tidak masalah. Jika Anda memilih untuk mengecek nilai pengembaliannya!= null
, itu.FirstOrDefault()
adalah pilihan yang lebih baik.Tapi saya kira ini juga sedikit preferensi pribadi. Gunakan mana yang lebih masuk akal bagi Anda dan lebih cocok dengan gaya pengkodean Anda.
sumber
Pertama()
FirstOrDefault ()
Kami memiliki tabel UserInfos, yang memiliki beberapa catatan seperti yang ditunjukkan di bawah ini. Atas dasar tabel ini di bawah ini saya telah membuat contoh ...
Bagaimana cara menggunakan Pertama ()
Hanya ada satu catatan di mana ID == 1. Harus mengembalikan
ID catatan ini : 1 Nama Depan: Manish Nama Belakang: Dubey Email: [email protected]
Ada beberapa catatan di mana FName == "Rahul". Rekor pertama harus dikembalikan.
ID: 7 Nama Depan: Rahul Nama Belakang: Sharma Email: [email protected]
Tidak ada catatan dengan ID == 13. Kesalahan harus terjadi.
InvalidOperationException: Sequence tidak mengandung elemen
Cara Menggunakan FirstOrDefault ()
Hanya ada satu catatan di mana ID == 1. Harus mengembalikan
ID catatan ini : 1 Nama Depan: Manish Nama Belakang: Dubey Email: [email protected]
Ada beberapa catatan di mana FName == "Rahul". Rekor pertama harus dikembalikan.
ID: 7 Nama Depan: Rahul Nama Belakang: Sharma Email: [email protected]
Tidak ada catatan dengan ID == 13. Nilai kembali adalah nol
Semoga ini akan membantu Anda memahami kapan harus menggunakan
First()
atauFirstOrDefault()
.sumber
Pertama-tama,
Take
adalah metode yang sama sekali berbeda. Ini mengembalikanIEnumerable<T>
dan bukan tunggalT
, jadi itu keluar.Antara
First
danFirstOrDefault
, Anda harus menggunakanFirst
ketika Anda yakin bahwa suatu elemen ada dan jika tidak, maka ada kesalahan.Omong-omong, jika urutan Anda berisi
default(T)
elemen (misalnyanull
) dan Anda perlu membedakan antara yang kosong dan elemen pertamanull
, Anda tidak bisa menggunakanFirstOrDefault
.sumber
Pertama:
Kesalahan FirstOrD:
Dari: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
sumber
Perbedaan lain yang perlu diperhatikan adalah bahwa jika Anda men-debug aplikasi di lingkungan Produksi, Anda mungkin tidak memiliki akses ke nomor baris, jadi mengidentifikasi
.First()
pernyataan tertentu dalam metode yang melempar pengecualian mungkin sulit.Pesan pengecualian juga tidak akan menyertakan ekspresi Lambda yang mungkin Anda gunakan yang akan membuat masalah lebih sulit untuk di-debug.
Itu sebabnya saya selalu menggunakan
FirstOrDefault()
meskipun saya tahu entri nol akan membentuk situasi yang luar biasa.sumber
Pertama()
Ketika Anda tahu bahwa hasil mengandung lebih dari 1 elemen yang diharapkan dan Anda hanya harus elemen urutan pertama.
FirstOrDefault ()
FirstOrDefault () sama seperti First () kecuali itu, jika tidak ada elemen yang cocok dengan kondisi yang ditentukan daripada mengembalikan nilai default tipe dasar dari koleksi generik. Itu tidak membuang InvalidOperationException jika tidak ada elemen yang ditemukan. Tapi koleksi elemen atau urutan adalah nol daripada melempar pengecualian.
sumber
Jenis fungsi ini milik operator elemen. Beberapa operator elemen berguna didefinisikan di bawah ini.
Kami menggunakan operator elemen ketika kami harus memilih satu elemen dari urutan berdasarkan kondisi tertentu. Berikut ini sebuah contoh.
Pertama () operator mengembalikan elemen pertama dari suatu urutan setelah memenuhi persyaratan. Jika tidak ada elemen yang ditemukan maka itu akan melempar pengecualian.
int result = items.Where (item => item == 2) .First ();
Operator FirstOrDefault () mengembalikan elemen pertama dari suatu urutan setelah memenuhi persyaratan. Jika tidak ada elemen yang ditemukan maka akan mengembalikan nilai default dari tipe itu.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
sumber
Saya menemukan sebuah situs web yang menjelaskan kebutuhan akan FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Jika tidak ada hasil untuk kueri, dan Anda ingin menelepon Pertama () atau Tunggal () untuk mendapatkan satu baris ... Anda akan mendapatkan pengecualian "Urutan tidak mengandung elemen".
Penafian: Saya tidak pernah menggunakan LINQ, jadi saya minta maaf jika ini jauh dari sasaran.
sumber
Yang mana yang akan digunakan? Itu harus diputuskan oleh logika bisnis, dan bukan rasa takut akan kegagalan pengecualian / program.
Misalnya, Jika logika bisnis mengatakan bahwa kita tidak dapat memiliki transaksi nol pada hari kerja (Asumsikan). Maka Anda sebaiknya tidak mencoba menangani skenario ini dengan beberapa pemrograman cerdas. Saya akan selalu menggunakan First () di atas koleksi tersebut, dan membiarkan program gagal jika sesuatu yang lain mengacaukan logika bisnis.
Kode:
Saya ingin melihat komentar orang lain tentang ini.
sumber
Baiklah saya beri dua sen. Kesalahan pertama / pertama adalah saat Anda menggunakan konstruktor kedua. Saya tidak akan menjelaskan apa itu, tetapi saat itulah Anda berpotensi selalu menggunakannya karena Anda tidak ingin membuat pengecualian.
sumber
Yang lain telah dengan sangat baik menggambarkan perbedaan antara
First()
danFirstOrDefault()
. Saya ingin mengambil langkah lebih lanjut dalam menafsirkan semantik dari metode ini. Menurut pendapat sayaFirstOrDefault
terlalu sering digunakan. Dalam sebagian besar kasus saat Anda memfilter data, Anda akan diharapkan untuk mendapatkan kembali kumpulan elemen yang cocok dengan kondisi logis atau elemen unik tunggal dengan pengidentifikasi unik - seperti pengguna, buku, posting dll ... Itu mengapa kita bahkan bisa mengatakan bahwa ituFirstOrDefault()
adalah bau kode bukan karena ada sesuatu yang salah dengan itu tetapi karena terlalu sering digunakan. Posting blog ini mengeksplorasi topik secara rinci. IMO sebagian besar kaliSingleOrDefault()
adalah alternatif yang jauh lebih baik jadi waspadalah terhadap kesalahan ini dan pastikan Anda menggunakan metode yang paling tepat yang secara jelas mewakili kontrak dan harapan Anda.sumber
LINQ banyak cara untuk menerapkan permintaan tunggal sederhana pada koleksi, hanya kami menulis bergabung dalam sql, filter dapat diterapkan pertama atau terakhir tergantung pada kebutuhan dan kebutuhan.
Berikut adalah contoh di mana kami dapat menemukan elemen dengan id di koleksi. Untuk menambahkan lebih banyak tentang ini, metode Pertama,,
FirstOrDefault
idealnya akan kembali sama ketika koleksi memiliki setidaknya satu catatan. Namun, jika suatu koleksi boleh kosong. kemudianFirst
akan mengembalikan pengecualian tetapiFirstOrDefault
akan kembalinull
atau default. Misalnya,int
akan mengembalikan 0. Dengan demikian penggunaan tersebut meskipun dikatakan sebagai preferensi pribadi, tetapi lebih baik digunakanFirstOrDefault
untuk menghindari penanganan pengecualian.sumber