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.
IEnumerableIQueryable
Nerede çalışırBellek (LINQ to Objects)Veri kaynağı (SQL'e çevrilir)
Lambda tipiFunc delegesiExpression tree
Uygun olduğu yerZaten bellekte olan veriDB 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 20

Repository 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 IQueryable dö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.
  1. .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.ZorC# & .NETBackend
  2. EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?OrtaC# & .NETBackend
  3. LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?OrtaC# & .NETBackend
  4. async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?ZorC# & .NETBackend
  5. ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?OrtaC# & .NETBackend
  6. ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?OrtaC# & .NETBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle