Lazy Loading, Eager Loading ve Explicit arasındaki fark

21 Şubat 2016 5 dk okuma süresi 389 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.
Form post ile giden tüm dataları loglama

Asp.net Core ile farklı bir class library'den appsettings json dosyasını kolayca okumak

Hatalı bundle kullanımından dolayı alınan MIME type hatası ve çözümü