Linq sorgularında kullanılan Single, SingleOrDefault, First ve FirstOrDefault arasındaki farkları sizlere örnek üzerinden anlatmaya çalışacağım.
Önce çok kısa açıklama yapmam gerekirse;
Single:
Eğer size tek bir sonucun döneceği kesin ise kullanın. Birden fazla sonuç ya da hiç sonuç dönmezse hata alırsınız.
SingleOrDefault:
Eğer size tek bir sonucun döneceği kesin ise ve de sonuç dönmeyebilir ise kullanın. Birden fazla sonuç dönerse hata alırsınız.
First:
Eğer size herhangi bir sonucun döneceği kesin ise kullanın, dönen sonuçlar içerisinde ilk elemanı alır. Eğer sonuç dönmez ise hata alırsınız.
FirstOrDefault:
Size dönen sonuçlar içerisinde ilk elemanı alır ve sonuç dönmez ise hata almazsınız.
Anlattığım bu durumları örnekler üzerinden incelersek; elimizde aşağıdaki gibi bir liste olsun.
List<int> data = new List<int> { 10, 20, 30, 40, 50 };
Single için;
data.Single(d => d == 10) // sonuç 10'dur.
data.Single(d => d == 70) // sonuç dönmez bu yüzden hata alırsınız.
data.Single(d => d >= 25) // şartı sağlayan 3 eleman var ama sonuç birden fazla olduğu için hata alırsınız.
data.Single(d => d >= 45) // şartı sağlayan tek bir eleman olduğundan hata almaz, sonuç 50'dir.
SingleOrDefault için;
data.SingleOrDefault(d => d == 20) // sonuç 20'dir.
data.SingleOrDefault(d => d == 70) // şartı sağlayan eleman yok, ama hata da almazsınız sonuç size 0 döner
data.SingleOrDefault(d => d >= 25) // şartı sağlayan 3 eleman var ama sonuç birden fazla olduğu için hata alırsınız.
data.SingleOrDefault(d => d >= 45) // şartı sağlayan tek bir eleman olduğundan hata almaz, sonuç 50'dir.
First için;
data.First(d => d == 30) // sonuç 30'dur.
data.First(d => d == 70) // sonuç dönmez bu yüzden hata alırsınız.
data.First(d => d >= 25) // şartı sağlayan 3 eleman var ama bunlardan ilk elamanı alır, sonuç 30'dur.
data.First(d => d >= 45) // şartı sağlayan tek bir eleman olduğundan, sonuç 50'dir.
FirstOrDefault için;
data.FirstOrDefault(d => d == 40) // sonuç 40'dır.
data.FirstOrDefault(d => d == 70) // şartı sağlayan eleman yok, ama hata da almazsınız sonuç size 0 döner
data.FirstOrDefault(d => d >= 25) // şartı sağlayan 3 eleman var ama bunlardan ilk elamanı alır, sonuç 30'dur.
data.FirstOrDefault(d => d >= 45) // şartı sağlayan tek bir eleman olduğundan, sonuç 50'dir.
Bu metotların arasındaki farkları yukarıdaki durumlar ile elimden geldiğince anlatmaya çalıştım, umarım anlaşılır olmuştur. Takıldığınız ya da anlaşılmayan bir yer varsa yorumlar kısmından soru ve görüşlerinizi mutlaka belirtin, iyi kodlamalar 🙂