First/Single ile FirstOrDefault/SingleOrDefault Farkları ve Kullanımları

Linq'da bir listeden seçim yaparken kullanabileceğimiz metotlar vardır.
  • First()
  • FirstOrDefault()
  • Single()
  • SingleOrDefault()
Bu metotlar geriye sadece tek bir eleman döndürecektir. Bütün metotlarda istediğimiz koşula uygun linq sorgulaması yapabiliriz. Bunun için metodun içerisinde lambda expression kullanırız.Öncelikle bu metotların özelliklerine ve farklarına değinelim.

First() ile FirstOrDefault() metotlarının farkı

First metodu, bir liste içerisindeki ilk elemanı seçmek için kullanılır.
  • Birden fazla sonuç dönüyorsa, sonuç kümesindeki ilk elemanı döndürür.
  • İstenen koşulda bir eleman yoksa, InvalıdOperationException hatası döndürecektir.
FirstOrDefault metodu da bir liste içerisindeki ilk elemanı seçmek için kullanılır.
  • Birden fazla sonuç dönüyorsa, sonuç kümesindeki ilk elemanı döndürür.
  • Ek olarak, istenen koşulda eleman yoksa varsayılan değer olarak; dönüş tipi int ise 0, string, char ise null olarak döndürecektir.

Single() ile SingleOrDefault() metotlarının farkı

Single metodu, veritabanında Id kolonu gibi tek bir veri döneceği kesin olan durumlarda kullanılır.

First metodundan farkı istenilen koşula uygun tek bir eleman seçimi yapılacaktır, ilk elemanı seçme işlemi First metodu ile yapılıyordu.

Aşağıdaki durumlar oluştuğu takdirde InvalıdOperationException hatası alacağız.
  • İstenen koşula uygun veri olmaması
  • Birden fazla veri olması
SingleOrDefault metodu da tek bir veri seçimi yapan metottur.

Aşağıdaki durum oluştuğu taktirde InvalıdOperationException hatası alacağız.
  • Birden fazla veri olması
Eğer istenen koşulda eleman yoksa varsayılan değer olarak; dönüş tipi int ise 0, string, char ise null olarak döndürecektir.


Örnek olarak 3 adet farklı tipte dizimiz olsun ve bütün metodları bu dizilerde kullanalım.

  int[] sayilar = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

  char[] karakterler = { 'a', 'b', 'c', 'd', 'e' };

  string[] kelimeler = { "mert", "ali", "ayhan" };

Single() Metodu Kullanımı

Single() metodunu kullanmak için dizimizin adından sonra çağırmamız yeterlidir.

 var intsingle = sayilar.Single(x => x == 3);              //Sonuç 3
 var charsingle = karakterler.Single(x => x == 'e');       //Sonuç e
 var stringsingle = kelimeler.Single(x => x == "mert");    //Sonuç mert

 //İstenen koşula uygun veri olmamasından dolayı hata fırlatır.
 var intsingle= sayilar.Single(x => x == 20);
 var charsingle = karakterler.Single(x => x > 'e');
 var stringsingle = kelimeler.Single(x => x == "mer");

 //Birden fazla veri olduğu için hata fırlatır.
 var intsingle = sayilar.Single();
 var charsingle = karakterler.Single();
 var stringsingle = kelimeler.Single();

SingleOrDefault() Metodu Kullanımı

SingleOrDefault() metodunu kullanmak için dizimizin adından sonra çağırmamız yeterlidir.

 var intSingleOrDefault= sayilar.SingleOrDefault(x => x == 20);           //Sonuç 0
 var charSingleOrDefault = karakterler.SingleOrDefault(x => x > 'e');     //Sonuç null (Console'da boş değer)
 var stringSingleOrDefault= kelimeler.SingleOrDefault(x => x == "mer");   //Sonuç null (Console'da boş değer)

 //Birden fazla değer olduğu için hata alacağız.
 var intSingleOrDefault = sayilar.SingleOrDefault();
 var charSingleOrDefault = karakterler.SingleOrDefault();
 var stringSingleOrDefault = kelimeler.SingleOrDefault();

 var intSingleOrDefault = sayilar.SingleOrDefault(x => x == 3);           //Sonuç 3
 var charSingleOrDefault = karakterler.SingleOrDefault(x => x == 'e');    //Sonuç e
 var stringSingleOrDefault = kelimeler.SingleOrDefault(x => x == "mert"); //Sonuç mert

First() Metodu

First metodunu kullanmak için dizimizin adından sonra çağırmamız yeterlidir.

 var intfirst = sayilar.First();                           //Sonuç 1
 var charfirst = karakterler.First();                      //Sonuç a
 var stringfirst = kelimeler.First();                      //Sonuç mert

 var intfirst= sayilar.First(x => x > 6);                  //Sonuç 7
 var charfirst= karakterler.First(x => x > 'b');           //Sonuç c
 var stringfirst = kelimeler.First(x => x == "ali");       //Sonuç ali

 //Alttaki kod satırlarında InvalidOperationException hatası alacağız. İstenen koşula uygun veri olamadığından dolayı
 var intfirst = sayilar.First(x => x == 20);
 var charfirst= karakterler.First(x => x > 'e');
 var stringfirst = kelimeler.First(x => x == "mer");

FirstOrDefault() Metodu

FirstOrDefault metodunu kullanmak için dizimizin adından sonra çağırmamız yeterlidir. Bu şekilde kullanmamız bize ilk elemanı döndürecektir.

 var intfirstOrDefault = sayilar.FirstOrDefault();                        //Sonuç 1
 var charfirstOrDefault = karakterler.FirstOrDefault();                   //Sonuç a
 var stringfirstOrDefault = kelimeler.FirstOrDefault();                   //Sonuç mert 
 var intfirstOrDefault = sayilar.FirstOrDefault(x => x > 6);              //Sonuç 7 
 var charfirstOrDefault = karakterler.FirstOrDefault(x => x > 'b');       //Sonuç c
 var stringfirstOrDefault = kelimeler.FirstOrDefault(x => x == "ali");    //Sonuç ali
 var intfirstOrDefault = sayilar.FirstOrDefault(x => x == 20);            //Sonuç 0
 var charfirstOrDefault = karakterler.FirstOrDefault(x => x > 'e');       //Sonuç null (Console'da boş değer)
 var stringfirstOrDefault = kelimeler.FirstOrDefault(x => x == "mer");    //Sonuç null (Console'da boş değer)

Özet olarak bu dört metodu bir tabloda anlatacak olursak

Metot Veri Yoksa Tek Veri Birden Fazla Veri
Single Hata Tek Veri Hata
First Hata İlk Veri İlk Veri
SingleOrDefault Varsayılan Tek Veri Hata
FirstOrDefault Varsayılan İlk Veri İlk Veri




Yorumlar