Lazy Loading, Eager Loading ve Explicit arasındaki fark
21 Şubat 2016
5 dk okuma süresi
991 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?
İlginizi çekebilecek diğer yazılar.