Halasztott és azonnali betöltés
Amikor lekérdez egy objektumot, valójában csak a kért objektumot kéri le. A kapcsolódó objektumok nem lesznek automatikusan beolvasva egyszerre. (További információ: Lekérdezés kapcsolatok között.) Nem látja azt a tényt, hogy a kapcsolódó objektumok még nincsenek betöltve, mert a hozzáférésük megkísérlése egy kérést eredményez, amely lekéri őket.
Előfordulhat például, hogy le szeretne kérdezni egy adott rendeléscsoportot, majd csak alkalmanként küld e-mail-értesítést bizonyos ügyfeleknek. Kezdetben nem feltétlenül szükséges az összes ügyféladat lekérése minden megrendeléssel. Halasztott betöltéssel elhalaszthatja a további információk lekérését, amíg egyáltalán nem kell. Vegyük a következő példát:
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
Az ellenkezője is igaz lehet. Előfordulhat, hogy van egy alkalmazás, amelynek egyszerre kell megtekintenie az ügyfelek adatait, és adatokat kell megrendelnie. Tudja, hogy mindkét adatkészletre szüksége van. Tudja, hogy az alkalmazásnak szüksége van az egyes ügyfelek megrendelési adataira, amint megkapja az eredményeket. Nem szeretne egyedi lekérdezéseket küldeni minden ügyfél rendeléseihez. Amit igazán szeretne, hogy lekérje a rendelési adatokat az ügyfelekkel együtt.
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
Az ügyfeleket és a rendeléseket egy lekérdezésben is csatlakoztathatja a kereszttermék kialakításával és az összes relatív adatbit lekérésével egy nagy kivetítésként. Ezek az eredmények azonban nem entitások. (További információ: A LINQ–SQL Object Model). Az entitások identitással rendelkező és módosítható objektumok, míg ezek az eredmények olyan előrejelzések, amelyek nem módosíthatók és nem tárolhatók. Még rosszabb, ha sok redundáns adatot kér le, mivel minden ügyfél megismétli az egyes megrendeléseket az összesimított illesztési kimenetben.
Amire valóban szüksége van, az a kapcsolódó objektumok egy készletének egyidejű lekérésének módja. A halmaz egy gráf egy tagolt szakasza, így soha nem kér le többet vagy kevesebbet, mint amennyi a kívánt használathoz szükséges. Ebből a célból a LINQ to SQL az objektummodell egy régiójának azonnali betöltését teszi lehetővé DataLoadOptions . A metódusok a következők:
A LoadWith fő célhoz kapcsolódó adatok azonnali betöltésének módszere.
Az AssociateWith adott kapcsolathoz lekért objektumok szűrésére szolgáló módszer.