Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Ao consultar um objeto, você realmente recupera apenas o objeto solicitado. 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 ainda não estão carregados, pois uma tentativa de acessá-los produz uma solicitação que os recupera.
Por exemplo, talvez você queira consultar um determinado conjunto de pedidos e, em seguida, apenas ocasionalmente enviar uma notificação por email para clientes específicos. Você não precisaria necessariamente recuperar inicialmente todos os dados do cliente com cada pedido. Você pode usar o carregamento adiado para adiar a recuperação de informações extras até que seja absolutamente necessário. 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 verdade. Você pode ter um aplicativo que precisa exibir dados de pedidos e clientes ao mesmo tempo. Você sabe que precisa de ambos os conjuntos de dados. Você sabe que seu aplicativo precisa de informações de pedido para cada cliente assim que obter os resultados. Você não gostaria de enviar consultas individuais para cada pedido de cada cliente. O que você realmente deseja é recuperar os dados do pedido junto 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 LINQ to SQL). Entidades são objetos que têm identidade e que você pode modificar, enquanto esses resultados seriam projeções que não podem ser alteradas e persistidas. 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ê realmente precisa é de uma maneira de recuperar um conjunto de objetos relacionados ao mesmo tempo. 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. Para essa finalidade, o LINQ to SQL fornece DataLoadOptions para carregamento imediato de uma região do seu modelo de objeto. Os métodos incluem:
O LoadWith método, para carregar imediatamente os dados relacionados ao destino principal.
O AssociateWith método, para filtrar objetos recuperados para uma relação específica.