Carga inmediata y carga diferida

Al consultar un objeto, en realidad se recupera únicamente el objeto solicitado. Los objetos relacionados no se capturan automáticamente al mismo tiempo. (Para más información, consulte Consultas entre relaciones). No hay forma de saber si los objetos relacionados están ya cargados, porque, si se intenta tener acceso a ellos, se genera una solicitud que los recupera.

Por ejemplo, quizás desee consultar un conjunto determinado de pedidos y después, solo en algunas ocasiones, enviar una notificación por correo electrónico a determinados clientes. Inicialmente, no está obligado a recuperar todos los datos de clientes con todos los pedidos. Puede utilizar la carga aplazada para aplazar la recuperación de información adicional hasta que ésta no sea realmente necesaria. Considere el ejemplo siguiente:

    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

También podría darse el caso contrario. Es posible que una aplicación necesite ver al mismo tiempo los datos de los clientes y los pedidos. Sabe que necesita ambos conjuntos de datos. Sabe que su aplicación necesita información de los pedidos de cada cliente en cuanto obtiene los resultados. Seguramente no deseará enviar consultas individuales para los pedidos de cada cliente. Lo que realmente desea es recuperar los datos de pedidos junto con los 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

También puede combinar clientes y pedidos en una consulta si forma el producto cruzado y recupera todos los elementos de datos relativos como una gran proyección. Sin embargo, estos resultados no son entidades. (Para más información, consulte El modelo de objetos de LINQ to SQL). Las entidades son objetos que tienen identidad y que se pueden modificar, mientras que estos resultados serían proyecciones que no se pueden cambiar ni conservar. Lo que es peor, recuperaría una gran cantidad de datos redundantes, ya que cada cliente se repite para cada pedido en el resultado simplificado de la combinación.

Lo que realmente necesita es una manera de recuperar al mismo tiempo un conjunto de objetos relacionados. El conjunto es una sección delineada de un gráfico, de tal forma que nunca recuperaría más o menos de lo necesario para el uso previsto. Con este fin, LINQ to SQL proporciona DataLoadOptions para la carga inmediata de una región de un modelo de objetos. Entre los métodos, se incluyen:

  • El método LoadWith, para cargar inmediatamente los datos relacionados con el destino principal.

  • El método AssociateWith, para filtrar los objetos recuperados para una relación determinada.

Consulte también