Adiado contra a carga immediate
Quando você consulta para um objeto, você só retorna o objeto que você solicitou. Os objetos relacionados não são buscados automaticamente ao mesmo tempo. (Para obter mais informações, consulte Consulta entre relações). Você não pode ver o fato de que os objetos relacionados não são carregados já, porque uma tentativa de acessar gerencia uma solicitação que recupere-os.
Por exemplo, você pode desejar consultar um determinado conjunto de pedidos e depois envie apenas ocasionalmente um email de notificação para clientes específicos. Você não precisará necessariamente inicialmente de recuperar todos os dados do cliente com cada pedido. Você pode usar o carregamento adiada para adiar a recuperação de informações extras até que você tenha que absolutamente. Considere o seguinte exemplo:
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
O oposto também pode ser true. Você pode ter um aplicativo que tenha que exibir o cliente e ordenação dados ao mesmo tempo. Você conhece-o necessidade dois conjuntos de dados. Você sabe suas informações de ordem das necessidades do aplicativo para cada cliente para que você obter os resultados. Você não deve enviar para consultas individuais de pedidos para cada cliente. O que você deseja realmente é recuperar os dados de pedidos juntamente com os clientes.
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
Você também pode associar à clientes e pedidos em uma consulta formando entre o produto e recuperar todos os bits de dados relacionados como uma grande projeção. Mas esses resultados não são entidades. (Para obter mais informações, consulte O modelo de objeto do LINQ to SQL). As entidades são objetos que possuem a identidade e que você pode alterar, enquanto esses resultados seriam as projeções que não podem ser modificadas e persistente. Ainda pior, você poderia ser recuperando lotes de dados redundantes como as repetições de cada cliente para cada ordem em aplainado se associam a saída.
O que você precisa realmente é uma maneira para recuperar ao mesmo tempo um conjunto de objetos relacionados. O conjunto é uma seção delineado de um gráfico de modo que você nunca está recuperando mais ou menos que foi necessário para seu uso pretendido. Essa finalidade, o LINQ to SQL fornece DataLoadOptions para o carregamento imediata de uma região do seu modelo de objeto. Os métodos incluem:
O método LoadWith, para carregar imediatamente os dados relacionados ao destino principal.
O método de AssociateWith , para filtrar os objetos recuperados para um relacionamento específico.