Berikut ini ikhtisar dari berbagai metode:
Temukan () - ketika Anda ingin mendapatkan item dengan kunci utama. Ini akan mengembalikan null jika tidak dapat menemukan item. Ini akan melihat dalam konteks sebelum pergi ke database (seperti yang ditunjukkan oleh Yaron di komentar) yang dapat menjadi faktor efisiensi penting jika Anda perlu mendapatkan entitas yang sama beberapa kali sementara konteks yang sama masih aktif.
Single () - ketika Anda mengharapkan tepat satu item dikembalikan oleh kueri. Ini akan memunculkan pengecualian jika kueri tidak mengembalikan tepat satu item.
SingleOrDefault () - saat Anda mengharapkan nol atau satu item dikembalikan oleh kueri (yaitu Anda tidak yakin apakah item dengan kunci tertentu ada). Ini akan memunculkan pengecualian jika kueri tidak mengembalikan nol atau satu item.
First () - ketika Anda mengharapkan satu atau beberapa item dikembalikan oleh kueri tetapi Anda hanya ingin mengakses item pertama dalam kode Anda (pengurutan bisa menjadi penting dalam kueri di sini). Ini akan memunculkan pengecualian jika kueri tidak mengembalikan setidaknya satu item.
FirstOrDefault () - ketika Anda mengharapkan nol atau lebih item untuk dikembalikan oleh kueri tetapi Anda hanya ingin mengakses item pertama dalam kode Anda (yaitu Anda tidak yakin apakah item dengan kunci yang diberikan ada)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
atauSingleOrDefault
akan meminta 2 catatan (batas 2) sementaraFirst
atauFirstOrDefault
akan meminta 1 (batas 1).Saya selalu cenderung menggunakan
FirstOrDefault
. Jika Anda benar-benar ingin pilih-pilih dengan performa, Anda harus menggunakanFirstOrDefault
EF. Di bawah sampulSingleOrDefault
menggunakan top (2) dalam kueri karena, perlu memeriksa apakah ada baris kedua yang cocok dengan kriteria dan jika ya, itu akan membuat pengecualian. Pada dasarnyaSingleOrDefault
Anda mengatakan bahwa Anda ingin melempar pengecualian jika kueri Anda mengembalikan lebih dari 1 catatan.sumber
FirstOrDefault
danSingleOrDefault
menjadi signifikan? Saya akan mengatakan itu adalah pengoptimalan prematur dalam banyak kasus.Single()
atauSingleOrDefault()
ketika saya mengembalikan sesuatu yang seharusnya hanya ada satu . Alasan saya melakukannya adalah untuk menemukan bug dengan membuat kueri yang ditulis dengan buruk, yang menghasilkan lebih dari yang seharusnya, gagal. Setidaknya dalam pikiran saya, ini akan membantu menjaga konsistensi data dalam sistem. Tentu saja ini lebih lambat, tapi saya rasa tidak lebih lambat, dan saya bersedia membayar harga itu.Ini sangat sederhana:
Single
mengembalikan satu item dan memberikan pengecualian jika tidak ada atau lebih dari satu item.First
akan mengembalikan barang pertama atau melempar jika tidak ada barang.FirstOrDefault
akan mengembalikan item pertama atau mengembalikan nilai default (null
jika tipe yang diberikan adalah tipe referensi) ketika tidak ada item.Ini adalah perilaku yang seharusnya dimiliki API. Namun perlu diperhatikan bahwa implementasi yang mendasari dapat memiliki perilaku yang berbeda. Meskipun Entity Framework mematuhi hal ini, O / RM seperti LLBLGen juga dapat kembali
null
saat memanggilFirst
yang merupakan hal yang sangat aneh. Ini adalah keputusan yang sangat aneh (dan keras kepala) oleh desainer IMO.sumber
Single
menyatakan dengan jelas bahwa Anda hanya mengharapkan hasil memiliki satu elemen.Keempat metode masing-masing memiliki tempatnya; Padahal Anda sebenarnya hanya memiliki dua operasi yang berbeda.
Versi xxxxOrDefault () hanya menambahkan "Saya tidak ingin menganggap kumpulan hasil kosong sebagai keadaan luar biasa."
sumber
Di sisi lain, Anda dapat membagi metode ini dengan logika inti, seperti ini:
Untuk beberapa detail kinerja, terutama dalam kasus kedua, Anda dapat melihat di sini: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
Selain itu, di grup pertama Anda dapat menentukan kueri kompleks, tetapi dengan metode Find () Anda hanya dapat memberikan kunci entitas untuk pencarian.
sumber
Single () dan SingleOrDefault () biasanya digunakan pada pengenal unik seperti ID, sedangkan First () atau FirstOrDefault () biasanya digunakan untuk kueri yang bisa memiliki beberapa hasil tetapi Anda hanya menginginkan "Top 1" .
Single () atau First () akan memunculkan pengecualian jika tidak ada hasil yang dikembalikan, SingleOrDefault () dan FirstOrDefault () menangkap pengecualian dan mengembalikan null atau default (ResultDataType).
sumber