Bagikan melalui


Ditangguhkan versus Pemuatan Langsung

Saat Anda meminta sebuah objek, Anda sebenarnya hanya mengambil objek yang diminta. Objek terkait tidak diambil secara otomatis secara bersamaan. (Untuk informasi selengkapnya, lihat Melakukan Query Antara Hubungan.) Anda tidak dapat melihat bahwa objek terkait belum dimuat, karena upaya untuk mengaksesnya akan menimbulkan permintaan untuk mengambilnya.

Misalnya, Anda mungkin ingin mengkueri sekumpulan pesanan tertentu lalu hanya sesekali mengirim pemberitahuan email ke pelanggan tertentu. Pada awalnya, Anda tidak perlu selalu mengumpulkan semua data pelanggan dengan setiap pesanan. Anda dapat menggunakan pemuatan yang ditangguhkan untuk menunda pengambilan informasi tambahan sampai Anda benar-benar harus melakukannya. Pertimbangkan contoh berikut:

    Northwnd db = new Northwnd(@"northwnd.mdf");

    IQueryable<Order> notificationQuery =
    from ord in db.Orders
 where ord.ShipVia == 3
  select ord;

    foreach (Order ordObj in notificationQuery)
    {
        if (ordObj.Freight > 200)
            SendCustomerNotification(ordObj.Customer);
        ProcessOrder(ordObj);
    }
}
Dim db As New Northwnd("c:\northwnd.mdf")
Dim notificationQuery = _
    From ord In db.Orders _
    Where ord.ShipVia = 3 _
    Select ord

For Each ordObj As Order In notificationQuery
    If ordObj.Freight > 200 Then
        SendCustomerNotification(ordObj.Customer)
        ProcessOrder(ordObj)
    End If

Next

Sebaliknya mungkin juga benar. Anda mungkin memiliki aplikasi yang harus melihat data pelanggan dan pesanan secara bersamaan. Anda tahu bahwa Anda memerlukan kedua set data. Anda tahu aplikasi Anda membutuhkan informasi pesanan untuk setiap pelanggan segera setelah Anda mendapatkan hasilnya. Anda tidak ingin mengirimkan kueri individual untuk pesanan dari setiap pelanggan. Yang benar-benar Anda inginkan adalah mengambil data pesanan bersama dengan pelanggan.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

db.DeferredLoadingEnabled = false;

IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

foreach (Customer custObj in custQuery)
{
    foreach (Order ordObj in custObj.Orders)
    {
        ProcessCustomerOrder(ordObj);
    }
}
Dim db As New Northwnd("c:\northwnd.mdf")

db.DeferredLoadingEnabled = False

Dim custQuery = _
    From cust In db.Customers _
    Where cust.City = "London" _
    Select cust

For Each custObj As Customer In custQuery
    For Each ordObj As Order In custObj.Orders
        ProcessCustomerOrder(ordObj)
    Next
Next

Anda juga dapat menggabungkan pelanggan dan pesanan dalam kueri dengan membentuk lintas produk dan mengambil semua bit data relatif sebagai satu proyeksi besar. Tetapi hasil ini bukan entitas. (Untuk informasi selengkapnya, lihat LINQ ke SQL Object Model). Entitas adalah objek yang memiliki identitas dan dapat Anda ubah, sedangkan hasil ini akan menjadi proyeksi yang tidak dapat diubah dan dipertahankan. Lebih buruk lagi, Anda akan mengambil banyak data redundan saat setiap pelanggan mengulangi untuk setiap pesanan dalam output gabungan yang diratakan.

Apa yang benar-benar Anda butuhkan adalah cara untuk mengambil sekumpulan objek terkait secara bersamaan. Set adalah bagian terdefinisi dari grafik sehingga Anda tidak akan pernah mengambil data lebih atau kurang dari yang diperlukan untuk penggunaan Anda. Untuk tujuan ini, LINQ ke SQL menyediakan DataLoadOptions untuk memuat langsung bagian wilayah dari model objek Anda. Metode meliputi:

  • Metode LoadWith untuk segera memuat data yang terkait dengan target utama.

  • Metode AssociateWith untuk memfilter objek yang diambil untuk hubungan tertentu.

Lihat juga