IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?
Cevap
- `IEnumerable<T>`: bellekteki bir koleksiyon üzerinde çalışır. Lambda'lar
Func<T, bool>delegesidir ve uygulama içinde (C# kodu olarak) çalışır. - `IQueryable<T>`: sorguyu bir expression tree (
Expression<Func<T, bool>>) olarak tutar. Provider (EF Core) bu ağacı SQL'e çevirir ve filtreleme veritabanında yapılır.
| IEnumerable | IQueryable | |
|---|---|---|
| Nerede çalışır | Bellek (LINQ to Objects) | Veri kaynağı (SQL'e çevrilir) |
| Lambda tipi | Func delegesi | Expression tree |
| Uygun olduğu yer | Zaten bellekte olan veri | DB sorgusu oluştururken |
Klasik hata
// Kötü: önce tüm tablo belleğe çekilir, sonra filtrelenir
IEnumerable<Order> orders = db.Orders;
var recent = orders.Where(o => o.CreatedAt > since).Take(20).ToList();
// SQL: SELECT * FROM Orders (filtre yok!)
// İyi: filtre ve limit SQL'e gider
IQueryable<Order> q = db.Orders;
var recent2 = q.Where(o => o.CreatedAt > since)
.OrderByDescending(o => o.CreatedAt)
.Take(20)
.ToList();
// SQL: SELECT ... WHERE CreatedAt > @p ORDER BY ... LIMIT 20Repository metodunuz IEnumerable<T> döndürüyorsa, çağıran taraftaki her Where bellekte çalışır. Aynı şey AsEnumerable() çağrısından sonra da olur.
Diğer notlar
IQueryable'da SQL'e çevrilemeyen bir C# metodu kullanırsanız EF Core 3.0+ exception fırlatır (eskiden sessizce client-side evaluation yapardı).- Repository'den
IQueryabledöndürmek esneklik sağlar ama sorgu mantığını katmanlara dağıtır; birçok ekip bunun yerine spesifik metotlar veya specification pattern kullanır.
İlgili C# & .NET soruları
- .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.
- EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?
- LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?
- async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?
- ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?
- ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.