オブジェクトに対してクエリを実行すると、実際には要求したオブジェクトのみが取得されます。 関連オブジェクトは同時に自動的にフェッチされません。 (詳細については、「 リレーションシップ間のクエリ」を参照してください)。関連オブジェクトにアクセスしようとすると、オブジェクトを取得する要求が生成されるため、関連オブジェクトがまだ読み込まれていないことを確認できません。
たとえば、特定の注文セットに対してクエリを実行し、特定の顧客に電子メール通知を送信する場合があります。 必ずしも最初にすべての注文ですべての顧客データを取得する必要はありません。 遅延読み込みを使用して、絶対に必要になるまで追加情報の取得を延期できます。 次の例を確認してください。
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
また、クロス積を形成し、データのすべての相対ビットを 1 つの大きなプロジェクションとして取得することで、クエリで顧客と注文を結合することもできます。 ただし、これらの結果はエンティティではありません。 (詳細については、「 LINQ to SQL オブジェクト モデル」を参照してください)。 エンティティは ID を持ち、変更できるオブジェクトです。一方、これらの結果は変更および永続化できないプロジェクションになります。 さらに悪いことに、フラット化された結合出力内の各注文に対して各顧客が繰り返されるため、大量の冗長データを取得することになります。
実際に必要なのは、一連の関連オブジェクトを同時に取得する方法です。 このセットはグラフの線で示されたセクションであるため、意図した用途に必要以上に多かれ少なかれ取得されることはありません。 このため、LINQ to SQL では、オブジェクト モデルの領域を直ちに読み込むための DataLoadOptions が提供されます。 次のメソッドがあります。
LoadWithメソッドは、メインターゲットに関連するデータを直ちに読み込む。
AssociateWithメソッド。特定のリレーションシップに対して取得されたオブジェクトをフィルター処理します。