ana sayfa > Entity Framework > Lazy ve Eager Loading

Lazy ve Eager Loading

Pazartesi, 07 Ara 2009 yorum ekle yorumlara git

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…

Emre Yiğit

  1. Cumartesi, 10 Nis 2010 zamanında 09:13 | #1

    Güzel bilgiler fakat insanların ef ile bilmedikleri, yanıldıkları çok şeyler var vs2010 ile ef ye olan ilginin artacağı apacık ortada. Devamınının gelmesi umuduyla….

  2. Engin
    Perşembe, 01 Tem 2010 zamanında 07:16 | #2

    hocam bu işlem başka bu kadar güzel anlatılamazdı elinize ama devamını bekliyorum…

  1. şimdilik geri bağlantı yok