當您查詢物件時,實際上只會擷取您所要求的物件。 相關物件不會同時自動擷取。 (如需詳細資訊,請參閱 跨關聯性查詢。)您無法看到相關物件尚未載入的事實,因為嘗試存取它們會產生擷取它們的要求。
例如,您可能想要查詢特定訂單集,然後只偶爾傳送電子郵件通知給特定客戶。 您一開始不需要擷取每個訂單的所有客戶數據。 您可以使用延後載入來延遲取回額外的資訊,直到絕對必須時。 請考慮下列範例:
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
相反也可能是真的。 您可能有一個應用程式必須同時檢視客戶和訂購數據。 您知道您需要這兩組數據。 您知道您的應用程式在您取得結果后,就需要每位客戶的訂單資訊。 您不會想為每位客戶的訂單提交個別查詢。 您真正想要的是與客戶一起擷取訂單數據。
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
您也可以藉由形成跨產品並擷取所有數據的相對位做為一個大型投影,以聯結查詢中的客戶和訂單。 但這些結果不是實體。 (如需詳細資訊,請參閱 LINQ to SQL 物件模型)。 實體是具有身分識別且您可以修改的物件,而這些結果則是無法變更和保存的投影。 更糟的是,您會擷取大量的備援數據,因為每位客戶在扁平聯結輸出中重複每個訂單。
您真正需要的方法,是同時擷取一組相關物件的方法。 此集合是圖形的特定區塊,確保您擷取的資料不會超出或少於預期用途所需。 為了達到此目的,LINQ to SQL 提供 DataLoadOptions 立即載入物件模型的區域。 方法如下:
方法 LoadWith ,可立即載入與主要目標相關的數據。
方法 AssociateWith ,用來篩選針對特定關聯性擷取的物件。