Lazy Loading, Eager Loading ve Explicit arasındaki fark

21 Şubat 2016 5 dk okuma süresi 252 okunma

Entity Framework kullananlar bilirler; lazy, eager ve explicit loading denilen kavramlar vardır. Bunlar ilişkisel/alt objelerin yüklenmesinde kullanılır. Sıkça kullanıyoruz ama bunların arasındaki fark nedir birçok kişi bilmiyor, bu nedenle bu yazının bilmeyenler için faydalı olacağını düşünüyorum. Hemen örnekler üzerinden başlayalım.

// Kullanici ve KullaniciAdresleri şeklinde 2 adet class'iniz olduğunu düşünün

public partial class Kullanici
{
    public Kullanicilar()
    {
        this.KullaniciAdresleri = new List<KullaniciAdresleri>();
    }
        
    public int Id { get; set; }
    public string KullaniciAdi { get; set; }
    public string Sifre { get; set; }
    public DateTime Tarih { get; set; }
    
    public virtual ICollection<KullaniciAdresleri> KullaniciAdresleri { get; set; }
}


public partial class KullaniciAdresleri
{
    public int Id { get; set; }
    public int KullaniciId { get; set; }
    public string AdresTanimi { get; set; }
    public string Adres { get; set; }
    
    public virtual Kullanicilar Kullanicilar { get; set; }
}
<span class="redactor-invisible-space"></span>


Lazy Loading

using (var context = new DbContext())
{
    // Lazy loading varsayilan olarak aciktir.    
    var kullaniciListesi = context.Kullanici.ToList();

    foreach (var kullanici in kullaniciListesi)
    {
        Console.Log(kullanici.Id + " - " + kullanici.KullaniciAdi);

        foreach (var adres in kullanici.KullaniciAdresleri)
        {
            Console.Log(" " + adres.AdresTanimi + " - " + adres.Adres)
        }
    }    
}


Eager Loading

using (var context = new DbContext())
{
    // Lazy loading varsayilan olarak aciktir. Bunu eager loading'te kapatıyoruz.
    db.Configuration.LazyLoadingEnabled = false;
    
    // Burada lazy loading'te olduğu gibi 2 farklı sorgu çalışmaz
    // 2. foreach için otomatik sql sorgusu çalışması yerine tek bir sorgu ile ilişkisel veriler çekilir
    var kullaniciListesi = context.Kullanici
        Include(x => x.KullaniciAdresleri)
        //.Include("KullaniciAdresleri") // Bu şekilde de yazabilirsiniz
        .ToList();

    foreach (var kullanici in kullaniciListesi)
    {
        Console.Log(kullanici.Id + " - " + kullanici.KullaniciAdi);

        foreach (var adres in kullanici.KullaniciAdresleri)
        {
            Console.Log(" " + adres.AdresTanimi + " - " + adres.Adres)
        }
    }    
}


Explicit Loading

using (var context = new DbContext())
{
    // Lazy loading varsayilan olarak aciktir. Bunu explicit loading'te kapatıyoruz.
    db.Configuration.LazyLoadingEnabled = false;

    // Burada lazy loading'te olduğu gibi 2 farklı sorgu çalışmaz
    var kullaniciListesi = context.Kullanici
        Include(x => x.KullaniciAdresleri)
        //.Include("KullaniciAdresleri") // Bu şekilde de yazabilirsiniz
        .ToList();

    foreach (var kullanici in kullaniciListesi)
    {
        Console.Log(kullanici.Id + " - " + kullanici.KullaniciAdi);

        // Explicit loading'te ilişkisel veri bilinçli olarak yüklenir.
        // Eğer kullanıcı adresleri yüklenmediyse yükle gibi.
        // Bu nedenle burada tekrar 2. bir sorgu çalışır.
        if (kullanici.KullaniciAdresleri.isLoaded)
            kullanici.kullaniciListesi.Load();
            
        foreach (var adres in kullanici.KullaniciAdresleri)
        {
            Console.Log(" " + adres.AdresTanimi + " - " + adres.Adres)
        }
    }    
}
Yazılarıma abone olmak ister misiniz?
Spam yapılmaz, sadece bildirim amaçlıdır. İstediğiniz zaman abonelikten çıkabilirsiniz.
İlginizi çekebilecek diğer yazılar.
VS2015'in 3. update'ini yaptıktan sonra asp.net core web uygulaması yaratmak istediğimde şu şekilde bir hata ile karşılaştım. "Exception : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)". Çözümü oldukça basit.

Entity framework code first kullanıyorsanız ve inheritance yapıp yeni bir class yarattığınızda bunun gibi bir hata alırsınız. Bunun nedeni fluent api'nin inheritance yapılan class ile ana class'ın map yapmaya çalışması ve ilgili kolonu veritabanında bulamamasıdır. Çözümü ise inherit olmuş class'a [NotMapped] DataAnnotations attribute'unu eklemek.

Asp.Net Mvc ile recursive nasıl yazılır, @helper veya HtmlHelper kullanarak recursive fonksiyon yazmak, Asp.Net MVC View recursive fonksiyon nasıl yazılır?