IEnumerable, IQueryable ve List arasındaki farklar

IEnumerable, IQueryable ve List arasındaki farklar

1. IEnumerable Nedir?

  • Namespace: System.Collections veya System.Collections.Generic
  • Veri Kaynağı: Bellekte olabilir, veritabanı da olabilir.
  • Çalışma Şekli: Veriyi satır satır (tek tek) belleğe çeker.
  • Sorgu Tipi: Deferred Execution (ertelenmiş), ama sorgunun geri kalan kısmı bellekte işlenir.
  • Filtreleme Nerede Yapılır? Bellekte (In-Memory)
  • Kullanım Yeri: LINQ to Objects, basit liste işlemleri.
IEnumerable<Person> people = db.People.ToList(); // Liste çekildi
var result = people.Where(p => p.Age > 20);       // Filtreleme bellekte yapılır

✔ Artıları:

  • Tüm koleksiyon tiplerinde çalışır.
  • Hafif ve basit.

✖ Eksileri:

  • Veritabanına sorgu göndermez.
  • Filtreleme bellekte yapılacağı için performans kaybı olabilir.

2. IQueryable Nedir?

  • Namespace: System.Linq
  • Veri Kaynağı: Genelde veritabanı (Entity Framework, LINQ to SQL, MongoDb vs).
  • Çalışma Şekli: Sorgu SQL'e dönüştürülüp veritabanında çalıştırılır.
  • Filtreleme Nerede Yapılır? Veritabanında
  • Çalıştırma Zamanı: Gerçek veri çekme, döngüye girildiğinde veya .ToList(), .First(), .Count() çağrıldığında.
IQueryable<Person> people = db.People;
var result = people.Where(p => p.Age > 20); // SQL sorgusuna çevrilir

✔ Artıları:

  • Filtre/veri işlemleri veritabanında yapılır → Daha az veri belleğe çekilir.
  • Büyük verilerde yüksek performans sağlar.

✖ Eksileri:

  • Sadece sorgulanabilir veri kaynaklarında çalışır.
  • Karmaşık yapısı nedeniyle hata ayıklaması IEnumerable kadar kolay değildir.

3. List Nedir?

  • Namespace: System.Collections.Generic
  • Tür: Somut (concrete) bir koleksiyondur.
  • Veri Nerede? Tamamı RAM (bellek) üzerindedir.
  • Yazılabilir mi? Evet (Add, Remove gibi yöntemlerle değiştirilebilir).
List<Person> people = db.People.ToList(); // Tüm veriler belleğe çekildi
people.Add(new Person { Name = "Ali" });

✔ Artıları:

  • Veri tamamen bellekte → hızlı erişim.
  • Değiştirilebilir (mutable).

✖ Eksileri:

  • Büyük veri kümelerinde belleği çok tüketir.
  • Veritabanıyla direkt bağlantısı yoktur.

🎯 Karşılaştırma Tablosu

ÖzellikIEnumerableIQueryableList
Çalışma YeriBellek (In-Memory)Veritabanı (Remote)Bellek
SQL Sorgusu❌ Hayır✅ Evet❌ Hayır
Lazy Execution✅ Evet✅ Evet❌ Hayır (hemen çalışır)
Veri Değiştirilebilir mi?❌ Hayır (Sadece okuma)❌ Evet (ama genelde sorgu amaçlı)✅ Evet
Performans Bazlı KullanımKüçük verilerBüyük/veritabanı verileriBellekte çalışmak istediğinde
Modifikasyon

🧠 Bir cümleyle özetlersen:

  • IEnumerable: Veriyi belleğe çek ve orada işle.
  • IQueryable: Veriyi veritabanında işle ve sadece gerekli kısmı belleğe getir.
  • List: Veriyi tamamen belleğe al, üzerinde serbestçe değişiklik yap.

Lazy Execution (Ertelenmiş Çalıştırma) Nedir?

Lazy Execution, bir sorgunun tanımlandığı anda değil, ona gerçekte ihtiyaç duyulduğu anda çalıştırılmasıdır.

📌 Yani:

  • Kodda .Where(), .Select() gibi sorgular yazarsın ama henüz veritabanına gitmez veya bellekte çalışmaz.
  • Ancak .ToList(), .First(), .Count(), foreach gibi işlemler yapıldığında sorgu o anda çalıştırılır.

🔍 Örneğin:

var people = db.People.Where(p => p.Age > 20); // Daha sorgu yapılmadı! (Lazy)
var list = people.ToList();                   // İşte şimdi SQL sorgusu gönderilir!

İlk satırda sadece sorguyu tanımladın.
İkinci satırda sorguyu “çalıştırdın” ve veriler çekildi.


Lazy Execution'ın Avantajları:

AvantajAçıklama
✅ PerformansGereksiz veri çekmez, sadece gerçekten ihtiyaç olduğunda çalışır.
✅ Sorgu birleştirmeBirden fazla .Where(), .Select() ard arda eklersen hepsi sonunda tek sorguya dönüşür.
✅ Hafıza tasarrufuÖzellikle IQueryable’da, sadece ihtiyaç duyulan veri çekilir.

Lazy Execution’ın Devreye Girmesi:

Aşağıdaki işlemler yapıldığında sorgu artık çalışır (yani veri çekilir / SQL gönderilir):

✅ "Sorguyu tetikleyen" işlemler:

TetikleyiciAçıklama
.ToList()Veriyi tamamen belleğe alır.
.First() / .FirstOrDefault()Sadece ilk kaydı çeker ama yine sorguyu çalıştırır.
.Count()Kaç kayıt var diye sorgular.
foreach (var item in people)Döngüye girildiği anda sorgu çalışır.
.Any(), .Max(), .Min(), .Sum()Tümü sorguyu tetikler.

Eager Execution (Hemen Çalıştırma) Ne?

Lazy’in tam tersidir.

  • Sorguyu yazdığın anda çalışır.
  • Örneğin List oluştururken:
var people = db.People.ToList(); // Sorgu hemen çalışır, veri çekilir
var result = people.Where(p => p.Age > 20); // Artık bellekte filtreleme

🎯 Kısa Özet:

KavramAçıklaması
Lazy ExecutionSorgu tanımlanır ama çalışmaz, ancak ihtiyaç olunca çalışır.
IQueryableLazy execution + SQL veritabanında çalışır.
IEnumerableLazy execution + veri belleğe çekildikten sonra çalışır.
Eager ExecutionSorgu hemen çalışır, veri belleğe çekilir.

admin

Leave a Reply

Your email address will not be published. Required fields are marked *