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.