DEV Community

Mustafa  Çam
Mustafa Çam

Posted on

Lazy loading vs Eager loading

Eager Loading ve Lazy Loading iki farklı veri yükleme stratejisidir ve Entity Framework Core'da ilişkili verilerle çalışma şeklini etkiler. İşte bu iki yöntem arasındaki temel farklar:

1. Eager Loading (Önceden Yükleme)

Eager Loading, ilişkili verilerin sorgu yapıldığında hemen yüklenmesini sağlar. Bu yöntem, ilişkili verilerin aynı anda ve tek bir sorgu içinde getirilmesini sağlar. Genellikle Include metodunu kullanarak ilişkili verileri yükleyebilirsiniz.

Özellikleri:

  • Veri Çekme: İlişkili veriler, ana verilerle birlikte tek bir sorguda getirilir.
  • Performans: Birden fazla sorgu yapmak yerine, ilişkili verilerle birlikte tek bir sorgu gönderildiği için performans avantajı sağlar. Ancak, çok büyük veri setlerinde bu sorguların performansı etkilenebilir.
  • Kullanım: İlişkili verileri her zaman kullanmanız gerekiyorsa uygun bir yöntemdir.

Örnek:

Bir öğrenci ve onun derslerini aynı anda getirmek istiyorsanız:

var students = context.Students
                      .Include(s => s.Courses) // Öğrencinin derslerini de getirir
                      .ToList();
Enter fullscreen mode Exit fullscreen mode

2. Lazy Loading (Tembel Yükleme)

Lazy Loading, ilişkili verilerin yalnızca ihtiyaç duyulduğunda yüklenmesini sağlar. İlk sorguda yalnızca ana veri getirilir ve ilişkili veriler, erişilmeye çalışıldığında dinamik olarak veritabanından yüklenir. Lazy Loading, genellikle virtual keyword ile ilişkilendirilmiş navigation property'leri kullanır.

Özellikleri:

  • Veri Çekme: İlişkili veriler yalnızca erişildiğinde yüklenir. İlk başta yalnızca ana veriler getirilir.
  • Performans: Gereksiz veri yüklemesi önlenir, ancak ilişkili verilere erişildiğinde ek sorgular yapılır. Bu, büyük veri setlerinde fazla sorgu yapılmasına neden olabilir.
  • Kullanım: İlişkili verilere genellikle ihtiyaç duyulmuyorsa veya sadece bazı durumlarda erişilmesi gerekiyorsa uygun bir yöntemdir.

Örnek:

Bir öğrenci verisini aldıktan sonra, derslere yalnızca ihtiyacınız olduğunda erişmek istiyorsanız:

var student = context.Students.Find(1); // Sadece öğrenci verisi getirilir

// İlişkili dersler, öğrenciye erişildikten sonra gerektiğinde yüklenir
foreach (var course in student.Courses)
{
    Console.WriteLine(course.CourseName); // Bu noktada Courses verisi getirilir
}
Enter fullscreen mode Exit fullscreen mode

Karşılaştırma

  • Sorgu Sayısı:

    • Eager Loading: Tek bir sorgu ile ana ve ilişkili verileri getirebilir. Performans genellikle daha iyi olabilir, ancak büyük veri setlerinde veri aşırı yüklenmesine neden olabilir.
    • Lazy Loading: İlişkili veriler için ek sorgular yapar. İlişkilere erişildiğinde daha fazla sorgu yapıldığı için performans problemleri yaşanabilir.
  • Veri Miktarı:

    • Eager Loading: Daha fazla veri getirir çünkü ilişkili veriler de yüklenir. Bu, gereksiz veri getirilmesine neden olabilir.
    • Lazy Loading: Sadece erişildiğinde ilişkili veriler yüklenir, böylece gereksiz veriler getirilmez.
  • Performans:

    • Eager Loading: Genellikle daha performanslı olabilir çünkü sadece bir sorgu yaparak tüm gerekli veriler getirilir.
    • Lazy Loading: Ek sorgular gerektirdiği için bazı durumlarda performans sorunlarına yol açabilir.

Özet

  • Eager Loading: İlişkili verileri, ana verilerle birlikte önceden yükler. Tek bir sorguda tüm veriler getirilir, bu da performans avantajı sağlar ancak büyük veri setlerinde veritabanı aşırı yüklenmesine neden olabilir.
  • Lazy Loading: İlişkili verileri yalnızca ihtiyaç duyulduğunda yükler. İlk sorguda sadece ana veriler getirilir, ilişkili verilere erişildiğinde ek sorgular yapılır. Performansı artırabilir, ancak çok sayıda sorgu yapabilir.

Kullanım senaryonuza bağlı olarak bu yöntemlerden birini seçebilirsiniz. Örneğin, ilişkili verilere her zaman ihtiyacınız varsa eager loading, yalnızca bazı durumlarda ihtiyaç duyuyorsanız lazy loading tercih edilebilir.

Top comments (0)