Bagikan melalui


Ditangguhkan versus Pemuatan Segera

Saat Anda mengkueri objek, Anda benar-benar hanya mengambil objek yang Anda minta. Objek terkait tidak diambil secara otomatis secara bersamaan. (Untuk informasi selengkapnya, lihat Mengkueri Seluruh Hubungan.) Anda tidak dapat melihat fakta bahwa objek terkait belum dimuat, karena upaya untuk mengaksesnya menghasilkan permintaan yang mengambilnya.

Misalnya, Anda mungkin ingin mengkueri sekumpulan pesanan tertentu lalu hanya sesekali mengirim pemberitahuan email ke pelanggan tertentu. Anda tidak perlu pada awalnya untuk mengambil 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 pelanggan dan memesan data 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 untuk 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 Model Objek LINQ to SQL. 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 yang digambarkan dari grafik sehingga Anda tidak akan pernah mengambil lebih atau kurang dari yang diperlukan untuk penggunaan yang Anda maksudkan. Untuk tujuan ini, LINQ ke SQL menyediakan DataLoadOptions untuk pemuatan langsung wilayah 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