0Pricing
C# Academy · Pelajaran

Pemuatan Eager, Lazy & Eksplisit

Kendalikan waktu pemuatan data terkait menggunakan Include, ThenInclude, proksi lazy loading, dan pemanggilan Load secara eksplisit.

Pemuatan Eager, Lazy & Eksplisit adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Tiga Strategi Pemuatan

EF Core menyediakan tiga strategi untuk memuat data terkait: Pemuatan Segera (memuat bersama kueri), Pemuatan Lambat (memuat saat diakses), dan Pemuatan Eksplisit (memuat sesuai kebutuhan). Memilih strategi yang tepat akan menghindari masalah N+1 dan perjalanan bolak-balik ke basis data yang tidak diperlukan.

Pemuatan Segera dengan Include

Pemuatan segera menggunakan Include() untuk melakukan JOIN data terkait dalam kueri SQL yang sama. Ini adalah strategi yang paling mudah diprediksi dan menghindari masalah N+1.

// 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 ...

ThenInclude untuk Relasi Bertingkat

ThenInclude menelusuri graf navigasi lebih dalam. Anda dapat memuat beberapa tingkat dalam satu kueri.

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();

Include dengan Filter

EF Core 5+ mendukung pemfilteran data terkait di dalam Include. Dengan demikian, Anda dapat memuat sebagian data anak tanpa kueri terpisah.

// 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();

Menyiapkan Pemuatan Lambat

Pemuatan lambat secara otomatis memuat properti navigasi saat pertama kali diakses. Aktifkan dengan memasang paket Microsoft.EntityFrameworkCore.Proxies dan memanggil UseLazyLoadingProxies().

// 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>();
}

Pemuatan Lambat dalam Praktik (dan Jebakan N+1)

Pemuatan lambat memang praktis, tetapi berbahaya dalam perulangan — setiap akses memicu kueri SQL baru sehingga menyebabkan masalah N+1. Selalu utamakan pemuatan segera dalam skenario daftar.

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();

Pemuatan Eksplisit

Pemuatan eksplisit memungkinkan Anda memuat properti navigasi sesuai kebutuhan menggunakan Entry().Collection().LoadAsync() atau Entry().Reference().LoadAsync(). Ini berguna saat Anda hanya memerlukan data terkait dalam kondisi tertentu.

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();

Pemuatan Eksplisit dengan Filter Kueri

Anda dapat memfilter pemuatan eksplisit menggunakan .Query() sebelum memanggil LoadAsync(), sehingga jumlah data yang dikembalikan berkurang.

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);

Tiga Strategi Pemuatan

Memuat beberapa koleksi dalam satu kueri menyebabkan ledakan Kartesius (jumlah baris berlipat ganda). Gunakan AsSplitQuery() untuk menjalankan kueri terpisah untuk setiap koleksi, lalu menggabungkannya di memori.

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);

Proyeksi untuk Menghindari Pengambilan Data Berlebihan

Alih-alih memuat entitas lengkap beserta semua relasinya, lakukan proyeksi ke DTO dengan Select. Dengan begitu, Anda mendapatkan tepat data yang diperlukan dalam satu kueri yang dioptimalkan.

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

Dunia Nyata: Memilih Strategi yang Tepat

Gunakan panduan keputusan ini dalam praktik:

  • Pemuatan langsung + Include: Anda selalu memerlukan data terkait, seperti pada halaman daftar
  • Proyeksi: tampilan hanya-baca, respons API — paling efisien
  • Eksplisit: pemuatan bersyarat berdasarkan logika aplikasi
  • Tertunda: hindari dalam aplikasi web; gunakan hanya untuk desktop atau skrip dengan kumpulan data kecil

Pemeriksaan Singkat

Apa yang dimaksud dengan masalah N+1 dalam konteks pemuatan tertunda?

Ringkasan: Strategi Pemuatan

Hal-hal penting:

  • Pemuatan langsung (Include): memuat data dalam satu kueri — paling baik untuk pola akses yang dapat diprediksi
  • Include dengan filter: hanya memuat sebagian data turunan — EF Core 5+
  • Pemuatan tertunda: praktis tetapi berisiko — hindari dalam perulangan (masalah N+1)
  • Pemuatan eksplisit: memuat sesuai kebutuhan dengan kontrol yang terperinci
  • Proyeksi dengan Select: paling efisien untuk skenario hanya-baca
  • Kueri terpisah: menghindari ledakan Kartesius saat menggunakan Include pada beberapa koleksi

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pemuatan Eager, Lazy & Eksplisit” gratis?

Ya — teks lengkap “Pemuatan Eager, Lazy & Eksplisit” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Pemuatan Eager, Lazy & Eksplisit”?

Kendalikan waktu pemuatan data terkait menggunakan Include, ThenInclude, proksi lazy loading, dan pemanggilan Load secara eksplisit. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Pemuatan Eager, Lazy & Eksplisit” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pemuatan Eager, Lazy & Eksplisit
  2. SQL Mentah, Prosedur Tersimpan & Interpolasi
  3. Kueri Terkompilasi & Performa
  4. Filter Kueri Global & Entitas Owned
← Kembali ke C# Academy