Condividi tramite


Caricamento rinviato e immediato (LINQ to SQL)

Quando si esegue una query per un oggetto, si recupera in effetti solo l'oggetto richiesto. Gli oggetti correlati non vengono recuperati contemporaneamente in modo automatico. Per ulteriori informazioni, vedere Esecuzione di una query tra relazioni (LINQ to SQL). Non è possibile verificare che gli oggetti correlati non siano già stati caricati, perché un tentativo di accedervi produce una richiesta che ne comporta il recupero.

Ad esempio, è possibile eseguire una query per un particolare set di ordini, quindi inviare saltuariamente un avviso tramite posta elettronica a clienti particolari. Inizialmente potrebbe non essere necessario recuperare tutti i dati del cliente con ogni ordine. In questo caso è possibile utilizzare il caricamento posticipato per rinviare il recupero di informazioni aggiuntive finché non sarà assolutamente necessario. Si consideri l'esempio seguente:

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(@"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);
    }

}

Potrebbe anche essere vero il contrario. Si dispone di un'applicazione che richiede la visualizzazione contemporanea dei dati dei clienti e degli ordini. È noto che sono necessari entrambi i set di dati e che l'applicazione richiede informazioni sugli ordini per ogni cliente non appena vengono restituiti i risultati. Non si desidera inviare singole query per gli ordini di ogni cliente, bensì recuperare i dati degli ordini insieme ai clienti.

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
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);
    }
}

È inoltre possibile creare un join tra clienti e ordini in una query definendo il prodotto incrociato e recuperando tutti i relativi bit di dati come un'unica grande proiezione. Tali risultati non sono tuttavia entità. Per ulteriori informazioni, vedere Il modello a oggetti LINQ to SQL. Le entità sono oggetti con un'identità che è possibile modificare, mentre i risultati in questione sono proiezioni che non possono essere modificate né salvate in modo permanente. È inoltre possibile che vengano recuperati molti dati ridondanti, in quanto ogni cliente viene ripetuto per ogni ordine nell'output del join bidimensionale.

È invece utile disporre di un modo per recuperare contemporaneamente un set di oggetti correlati. Il set è una sezione delineata di un grafico che consente di recuperare sempre solo la quantità di dati necessaria per l'utilizzo desiderato. A questo scopo in LINQ to SQL è disponibile DataLoadOptions che consente il caricamento immediato di una parte del modello a oggetti. I metodi comprendono:

  • Il metodo LoadWith per caricare immediatamente dati relativi alla destinazione principale.

  • Il metodo AssociateWith per filtrare gli oggetti recuperati per una determinata relazione.

Vedere anche

Altre risorse

Concetti relativi alle query in LINQ to SQL