查询对象时,实际上只检索所请求的对象。 相关对象不会同时自动提取。 (有关详细信息,请参阅 跨关系查询。)无法看到相关对象尚未加载的事实,因为尝试访问它们会生成检索它们的请求。
例如,你可能想要查询一组特定的订单,然后仅偶尔向特定客户发送电子邮件通知。 你不一定需要最初检索每个订单的所有客户数据。 可以使用延迟加载来延迟检索额外信息,直到真正需要为止。 请看下面的示例:
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 用于筛选为特定关系检索的对象。