0Pricing
C# Academy · Ders

Hevesli, Tembel ve Açık Yükleme

İlişkili verilerin ne zaman yükleneceğini Include, ThenInclude, tembel yükleme vekilleri ve açık Load çağrılarıyla denetleyin.

Hevesli, Tembel ve Açık Yükleme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

Üç Yükleme Stratejisi

EF Core, ilişkili verileri yüklemek için üç strateji sunar: Önden Yükleme (sorguyla birlikte yükleme), Tembel Yükleme (erişim sırasında yükleme) ve Açık Yükleme (gerektiğinde yükleme). Doğru seçimi yapmak, N+1 sorununu ve gereksiz veritabanı gidiş gelişlerini önler.

Include ile Önden Yükleme

Önden yükleme, ilişkili verileri aynı sorguya JOIN ile dahil etmek için Include() kullanır. Bu, en öngörülebilir stratejidir ve N+1 sorunlarını önler.

// Single query with JOIN
var blogs = await _db.Blogs
    .Include(b => b.Posts)
    .Where(b => b.IsActive)
    .ToListAsync();

// SQL: SELECT * FROM Blogs LEFT JOIN Posts ON ...

İç İlişkiler için ThenInclude

ThenInclude, gezinme grafiğinde daha derin düzeylere ilerler. Tek bir sorguda birden çok düzey yükleyebilirsiniz.

var orders = await _db.Orders
    .Include(o => o.Customer)
    .Include(o => o.Lines)
        .ThenInclude(l => l.Product)
            .ThenInclude(p => p.Category)
    .Where(o => o.Status == OrderStatus.Pending)
    .ToListAsync();

Filtrelenmiş Include

EF Core 5 ve sonraki sürümler, ilişkili verilerin Include içinde filtrelenmesini destekler. Böylece ayrı bir sorgu çalıştırmadan alt varlıkların bir alt kümesini yükleyebilirsiniz.

// Load only published posts for each blog
var blogs = await _db.Blogs
    .Include(b => b.Posts.Where(p => p.IsPublished)
                         .OrderByDescending(p => p.PublishedAt)
                         .Take(5))
    .ToListAsync();

Tembel Yükleme Kurulumu

Tembel yükleme, gezinme özelliklerine ilk kez erişildiğinde bunları otomatik olarak yükler. Microsoft.EntityFrameworkCore.Proxies paketini yükleyip UseLazyLoadingProxies() çağrısını yaparak etkinleştirin.

// 1. Install package: dotnet add package Microsoft.EntityFrameworkCore.Proxies
// 2. Enable in DbContext setup:
builder.Services.AddDbContext<AppDbContext>(opt =>
    opt.UseSqlite(connStr)
       .UseLazyLoadingProxies());

// 3. Mark navigation properties as virtual:
public class Blog
{
    public int Id { get; set; }
    public virtual ICollection<Post> Posts { get; set; } = new List<Post>();
}

Tembel Yükleme İş Başında (ve N+1 Tuzağı)

Tembel yükleme kullanışlıdır; ancak döngülerde tehlikelidir — her erişim yeni bir veritabanı sorgusu çalıştırarak N+1 sorununa yol açar. Listeleme senaryolarında her zaman önden yüklemeyi tercih edin.

var blogs = await _db.Blogs.ToListAsync(); // 1 query

foreach (var blog in blogs)
{
    // BAD: each access fires a new query!
    var count = blog.Posts.Count; // N queries
    Console.WriteLine(count);
}

// FIX: Use eager loading
var blogs2 = await _db.Blogs.Include(b => b.Posts).ToListAsync();

Açık Yükleme

Açık yükleme, Entry().Collection().LoadAsync() veya Entry().Reference().LoadAsync() kullanarak bir gezinme özelliğini gerektiğinde yüklemenizi sağlar. İlişkili verilere koşula bağlı olarak ihtiyaç duyduğunuzda kullanışlıdır.

var blog = await _db.Blogs.FindAsync(1); // no posts loaded

// Load posts only when needed
if (needsPosts)
{
    await _db.Entry(blog!)
             .Collection(b => b.Posts)
             .LoadAsync();
}

// Load single reference
var post = await _db.Posts.FindAsync(99);
await _db.Entry(post!)
         .Reference(p => p.Blog)
         .LoadAsync();

Sorgu Filtresiyle Açık Yükleme

LoadAsync() çağrısından önce .Query() kullanarak açık yüklemeyi filtreleyebilir ve döndürülen veri miktarını azaltabilirsiniz.

var blog = await _db.Blogs.FindAsync(1);

// Only load posts published this year
await _db.Entry(blog!)
         .Collection(b => b.Posts)
         .Query()
         .Where(p => p.PublishedAt.Year == DateTime.UtcNow.Year)
         .LoadAsync();

Console.WriteLine(blog!.Posts.Count);

Büyük Include İşlemleri için Bölünmüş Sorgular

Birden fazla koleksiyonu tek bir sorguda yüklemek Kartezyen patlamaya (satırların çoğalmasına) neden olur. Her koleksiyon için ayrı sorgular çalıştırıp bunları bellekte birleştirmek üzere AsSplitQuery() kullanın.

var orders = await _db.Orders
    .Include(o => o.Lines)
    .Include(o => o.Shipments)
    .AsSplitQuery()  // 3 separate SELECTs instead of one giant JOIN
    .ToListAsync();

// Or configure globally:
opt.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);

Gereğinden Fazla Veri Çekmekten Kaçınmak için Projeksiyon

Tüm ilişkileriyle birlikte tam varlıkları yüklemek yerine, Select ile bir veri aktarım nesnesine projeksiyon uygulayın. Böylece ihtiyacınız olan verileri tek bir optimize edilmiş sorguda tam olarak elde edersiniz.

var summaries = await _db.Blogs
    .Select(b => new BlogSummaryDto
    {
        Name      = b.Name,
        PostCount = b.Posts.Count(p => p.IsPublished),
        LatestPost = b.Posts
            .Where(p => p.IsPublished)
            .OrderByDescending(p => p.PublishedAt)
            .Select(p => p.Title)
            .FirstOrDefault()
    })
    .ToListAsync();
// No Include needed - translated to subqueries

Gerçek Dünya: Doğru Stratejiyi Seçmek

Bu karar kılavuzunu uygulamada kullanın:

  • Önden yükleme + Include: ilişkili verilere her zaman ihtiyaç duyduğunuz liste sayfaları için
  • Projeksiyon: salt okunur görünümler ve API yanıtları için — en verimli seçenek
  • Açık yükleme: uygulama mantığına göre koşullu yükleme için
  • Tembel yükleme: web uygulamalarında kaçının; yalnızca küçük veri kümeleriyle masaüstü uygulamalarında veya betiklerde kullanın

Hızlı Kontrol

Tembel yükleme bağlamında N+1 sorunu nedir?

Özet: Yükleme Stratejileri

Temel çıkarımlar:

  • Önden yükleme (Include): verileri tek sorguda yükler — erişim düzeninin öngörülebilir olduğu durumlar için en iyisi
  • Filtrelenmiş Include: alt öğelerin yalnızca bir alt kümesini yükler — EF Core 5+
  • Tembel yükleme: kullanışlıdır ancak risklidir — döngülerde kaçının (N+1 sorunu)
  • Açık yükleme: ayrıntılı denetimle isteğe bağlı olarak yükleme
  • Select ile projeksiyon: salt okunur senaryolar için en verimli seçenek
  • Bölünmüş sorgular: birden fazla koleksiyon Include'u kullanıldığında Kartezyen patlamayı önler

Sıkça Sorulan Sorular

“Hevesli, Tembel ve Açık Yükleme” dersi ücretsiz mi?

Evet — “Hevesli, Tembel ve Açık Yükleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“Hevesli, Tembel ve Açık Yükleme” dersinde ne öğreneceğim?

İlişkili verilerin ne zaman yükleneceğini Include, ThenInclude, tembel yükleme vekilleri ve açık Load çağrılarıyla denetleyin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Hevesli, Tembel ve Açık Yükleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Hevesli, Tembel ve Açık Yükleme
  2. Ham SQL, Saklı Yordamlar ve Enterpolasyon
  3. Derlenmiş Sorgular ve Performans
  4. Genel Sorgu Filtreleri ve Sahipli Varlıklar
← C# Academy Sayfasına Dön