arşiv

yazılar buna göre etiketlendi; ‘Load’

Lazy ve Eager Loading

Pazartesi, 07 Ara 2009 2 yorum

Merhaba,
Bu makalede lazy ve eager loading olaylarını anlatmaya çalışacağım
Lazy Loading bir sorguda çektiğimiz verilerin bağlı oldu verileri getirmesine denir.Bu durum yerine göre kullanılır.Mesela hangi toptancıdan nekadar ürün alıyoruz, bunu öğrenmemiz lazım.
Bu örnekte Northwind veritabanını kullanacağım.
Bunun için aşağıdaki kodu yazarız.

  1. NorthwindEntities nt = new NorthwindEntities();          
  2. foreach (var item in nt.Suppliers)
  3. {  
  4. Console.WriteLine("Şirket Adı : {0}  {1}", item.CompanyName, item.Products.Count);
  5. }

Fakat sonuç aşağıdaki gibi olur.
Lazy ve Eager Loading
Peki neden böyle bir sonuçla karşılaştık ? Bunun cevabı çok açık Entity Framework geliştirilirken bu tip durumlar düşünülüp Lazy Loading false olarak gelmiştir.
Yani Suppliers tablosuna bağlı olan Products tablosu yuklenmemiştir.Dolayısıyla Products tablosu Count edilemedi.
Lazy Loading i aktif hale getirmek için aşağıdaki kod işimizi görmektedir.

  1. NorthwindEntities nt = new NorthwindEntities();          
  2. foreach (var item in nt.Suppliers)
  3. {
  4. if (!item.Products.IsLoaded)
  5. item.Products.Load();
  6. Console.WriteLine("Şirket Adı : {0} {1}", item.CompanyName, item.Products.Count);
  7. }

Buradaki IsLoaded property si Products tablosunun yüklenip yüklenmediğini söylemektedir.Load metodu ise Products tablosunun yüklenmesini sağlamaktadır.
Bu koddan sonra istenileni yapmış olduk.
Lazy ve Eager Loading
Fakat bu sonuçta ise performans kaybı yaşanmaktadır.SQL Server Proifiler ı açıp buna birlikte şahit olabiliriz.Yukarıdaki kodu çalıştırdığımız zaman sql sorgu yağmuruna tutulmaktadır.
Lazy ve Eager Loading
Burada analiz çok önemlidir. Biz sadece 2 kolonu kullanıyoruz ama bütün tabloyu çekiyoruz.Bu işlem oldukça külfetli oluyor.Bu yüzden Eager Loading metodunu kullanacağız.
Bunun için aşağıdaki kodu yazmak yeterli olacaktır.

  1. NorthwindEntities nt = new NorthwindEntities();          
  2. var sorgu=from c in nt.Suppliers.Include("Products") select new {c.CompanyName,c.Products.Count}
  3. foreach (var item in sorgu)
  4.  {
  5. Console.WriteLine("Şirket Adı : {0} {1}", item.CompanyName,item.Count);
  6. }

Buradaki Include metodu sayesinde Products tablosununa içerisine almasını sağladık ve daha fazla performans kazanmak için sorgu yazıp sadece kullnacağımız alanları çektik.
Bu koddan sonra SQL Server Proifiler ı tekrar kontrol edelim.
Lazy ve Eager Loading
Gerçekten fark edilebilir bir sonuç çıktı karşımıza :D
Bu makalemde sizlere Lazy ve Eager Loading i anlatmaya çalıştım. Başka bir makalede görüşmek üzere…

devamını oku…