Compartir a través de


Carga diferida frente a inmediata

Al consultar un objeto, en realidad solo se recupera el objeto que solicitó. 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, es posible que desee consultar un conjunto determinado de pedidos y, a continuación, enviar ocasionalmente una notificación por correo electrónico a determinados clientes. No es necesariamente necesario recuperar inicialmente todos los datos del cliente con cada pedido. Puede usar la carga diferida para aplazar la recuperación de información adicional hasta que tenga que hacerlo absolutamente. 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

Lo contrario también podría ser cierto. Es posible que tenga una aplicación que tenga que ver los datos de clientes y pedidos al mismo tiempo. Sabes que necesitas ambos conjuntos de datos. Sabe que la aplicación necesita información de pedido para cada cliente en cuanto obtenga 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. Pero estos resultados no son entidades. (Para obtener más información, vea El modelo de objetos 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 y 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 un conjunto de objetos relacionados al mismo tiempo. El conjunto es una sección delimitada de un gráfico, de manera que nunca extraerías más ni menos de lo necesario para tu uso previsto. Para ello, LINQ to SQL proporciona DataLoadOptions la carga inmediata de una región del modelo de objetos. Los métodos incluyen:

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

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

Consulte también