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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
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 gelir

Burada 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);
4
5var sonuc = context.Urunler.Where(u => u.Fiyat > 100 && u.Kategori == "Elektronik").OrderByDescending(u => u.Tarih).Take(10).ToList();
6
7// Konsola SQL yazılır, WHERE, ORDER BY, LIMIT hepsi veritabanında yapılmıştır

Beklenen çı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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz