개체를 쿼리할 때 실제로 요청한 개체만 검색합니다. 관련 개체는 동시에 자동으로 페치되지 않습니다. (자세한 내용은 관계 간 쿼리를 참조하세요.) 관련 개체에 액세스하려고 하면 해당 개체를 검색하는 요청이 생성되므로 관련 개체가 아직 로드되지 않았다는 사실을 알 수 없습니다.
예를 들어 특정 주문 집합을 쿼리한 다음 경우에 따라 특정 고객에게 이메일 알림을 보낼 수 있습니다. 처음부터 모든 주문에 대해 모든 고객 데이터를 가져올 필요는 반드시 없습니다. 지연된 로드를 사용하여 반드시 필요할 때까지 추가 정보 검색을 연기할 수 있습니다. 다음 예제를 고려하세요.
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 개체 모델을 참조하세요). 엔터티는 ID가 있고 수정할 수 있는 개체인 반면, 이러한 결과는 변경 및 유지할 수 없는 프로젝션입니다. 더 나쁜 것은 평면화된 조인 출력에서 각 고객이 각 주문을 반복할 때 많은 중복 데이터를 검색하게 된다는 것입니다.
실제로 필요한 것은 관련 개체 집합을 동시에 검색하는 방법입니다. 집합은 그래프의 설명된 섹션이므로 의도한 용도에 필요한 것보다 많거나 적게 검색하지 않습니다. 이를 위해 LINQ to SQL은 개체 모델의 영역을 즉시 로드할 수 있도록 합니다 DataLoadOptions . 메서드에는 다음이 포함됩니다.
LoadWith 주 대상과 관련된 데이터를 즉시 로드하는 메서드입니다.
AssociateWith 특정 관계에 대해 검색된 개체를 필터링하는 메서드입니다.