LINQ Performansı: Ne Zaman Veritabanına Sorgu Göndermeli?
# LINQ Performansı: Ne Zaman Veritabanına Sorgu Göndermeli?
LINQ ile çalışırken en sık yapılan hata, tüm veriyi belleğe çekerek sonra filtrelemektir. Bunun yerine filtreleme işini veritabanına yaptırmalısın. Fark muazzam.
LINQ'un iki farklı davranışı vardır:
IQueryable, sorgu ağacı oluşturur, veritabanına gönderilmesini bekler.
IEnumerable, belleğe çekildikten sonra işlem yapar.
Sorgu gönderimi (execution) genellikle şu durumlarda tetiklenir:
- `ToList()`, `ToArray()`, `FirstOrDefault()` gibi sonlandırıcı metodlar.
- `foreach` döngüsü başladığında.
- Sonuç üzerinde `.Count()` çağrıldığında.
Yanlış, tüm veriyi çek, sonra filtrele:
1var context = new UrunContext();2var urunler = context.Urunler.ToList(); // Tüm veritabanı belleğe alındı!3var sonuc = urunler.Where(u => u.Fiyat > 100).ToList();Bu kod veritabanında 1 milyon ürün varsa hepsini çeker, belleğe yükler, sonra C# tarafında filtreler. Felaket.
Doğru, filtrelemeyi veritabanında yap:
1var context = new UrunContext();2var sonuc = context.Urunler.Where(u => u.Fiyat > 100).ToList(); // Sadece fiyatı 100'den fazla olan ürünler gelirBurada LINQ, SQL sorgusuna çevirip veritabanına gönderir. Yalnızca gerekli veriler döner.
Gönderilen SQL'i görmek için Entity Framework logging'i aç:
1var context = new UrunContext();2var logger = LoggerFactory.Create(b => b.AddConsole());3context.Database.SetCommandTimeout(30);45var sonuc = context.Urunler.Where(u => u.Fiyat > 100 && u.Kategori == "Elektronik").OrderByDescending(u => u.Tarih).Take(10).ToList();67// Konsola SQL yazılır, WHERE, ORDER BY, LIMIT hepsi veritabanında yapılmıştırBeklenen çıktı: Konsolda SQL sorgusu görülür, veritabanından 10 kayıt gelir.
1var urunler = context.Urunler.AsEnumerable(); // İşte burada!2var sonuc = urunler.Where(u => u.Fiyat > 100).ToList();`AsEnumerable()` veya `ToList()` sorgudan sonra gelirse, LINQ to Objects (bellek) moduna geçer. Tüm veriler çekilir.
`IQueryable` üzerinde çalış, filtreleme ve sıralamayı bitmeden yapıştır. `ToList()` en sona koy. Böylece veritabanı ağır işi yapar, ağ trafiği azalır, uygulama hızlanır.
0 yorum