IEnumerable, IQueryable ve List arasındaki farklar

✅ 1. IEnumerable Nedir?
- Namespace:
System.CollectionsveyaSystem.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,Removegibi 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
| Özellik | IEnumerable | IQueryable | List |
|---|---|---|---|
| Çalışma Yeri | Bellek (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ım | Küçük veriler | Büyük/veritabanı verileri | Bellekte ç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(),foreachgibi 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ı:
| Avantaj | Açıklama |
|---|---|
| ✅ Performans | Gereksiz veri çekmez, sadece gerçekten ihtiyaç olduğunda çalışır. |
| ✅ Sorgu birleştirme | Birden 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:
| Tetikleyici | Açı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:
| Kavram | Açıklaması |
|---|---|
| Lazy Execution | Sorgu tanımlanır ama çalışmaz, ancak ihtiyaç olunca çalışır. |
| IQueryable | Lazy execution + SQL veritabanında çalışır. |
| IEnumerable | Lazy execution + veri belleğe çekildikten sonra çalışır. |
| Eager Execution | Sorgu hemen çalışır, veri belleğe çekilir. |





