Caricamento posticipato e immediatoDeferred versus Immediate Loading

Quando si esegue una query per un oggetto, si recupera in effetti solo l'oggetto richiesto.When you query for an object, you actually retrieve only the object you requested. Il correlati oggetti non vengono recuperati contemporaneamente.The related objects are not automatically fetched at the same time. (Per ulteriori informazioni, vedere l'esecuzione di query tra relazioni.) 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.(For more information, see Querying Across Relationships.) You cannot see the fact that the related objects are not already loaded, because an attempt to access them produces a request that retrieves them.

Potrebbe ad esempio, si desidera eseguire una query per un particolare set di ordini e quindi inviare saltuariamente una notifica tramite posta elettronica a clienti particolari.For example, you might want to query for a particular set of orders and then only occasionally send an email notification to particular customers. Inizialmente potrebbe non essere necessario recuperare tutti i dati del cliente con ogni ordine.You would not necessarily need initially to retrieve all customer data with every order. In questo caso è possibile usare il caricamento posticipato per rinviare il recupero di informazioni aggiuntive finché non sarà assolutamente necessario.You can use deferred loading to defer retrieval of extra information until you absolutely have to. Si consideri l'esempio seguente:Consider the following example:

    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

Potrebbe anche essere vero il contrario.The opposite might also be true. Si dispone di un'applicazione che richiede la visualizzazione contemporanea dei dati dei clienti e degli ordini.You might have an application that has to view customer and order data at the same time. È noto che sono necessari entrambi i set di datiYou know you need both sets of data. e che l'applicazione richiede informazioni sugli ordini per ogni cliente non appena vengono restituiti i risultati.You know your application needs order information for each customer as soon as you get the results. Non si desidera inviare singole query per gli ordini di ogni cliente,You would not want to submit individual queries for orders for every customer. bensì recuperare i dati degli ordini insieme ai clienti.What you really want is to retrieve the order data together with the customers.

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

È 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.You can also join customers and orders in a query by forming the cross-product and retrieving all the relative bits of data as one large projection. Tali risultati non sono tuttavia entità.But these results are not entities. (Per ulteriori informazioni, vedere LINQ al modello a oggetti SQL).(For more information, see The LINQ to SQL Object Model). 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.Entities are objects that have identity and that you can modify, whereas these results would be projections that cannot be changed and persisted. È inoltre possibile che vengano recuperati molti dati ridondanti, in quanto ogni cliente viene ripetuto per ogni ordine nell'output del join bidimensionale.Even worse, you would be retrieving lots of redundant data as each customer repeats for each order in the flattened join output.

È invece utile disporre di un modo per recuperare contemporaneamente un set di oggetti correlati.What you really need is a way to retrieve a set of related objects at the same time. Il set è una sezione delineata di un grafico che consente di recuperare sempre solo la quantità di dati necessaria per l'uso desiderato.The set is a delineated section of a graph so that you would never be retrieving more or less than was necessary for your intended use. A tale scopo, LINQ to SQLLINQ to SQL fornisce DataLoadOptions per il caricamento immediato di un'area del modello a oggetti.For this purpose, LINQ to SQLLINQ to SQL provides DataLoadOptions for immediate loading of a region of your object model. I metodi comprendono:Methods include:

  • Il metodo LoadWith per caricare immediatamente dati relativi alla destinazione principale.The LoadWith method, to immediately load data related to the main target.

  • Il metodo AssociateWith per filtrare gli oggetti recuperati per una determinata relazione.The AssociateWith method, to filter objects retrieved for a particular relationship.

Vedere ancheSee Also

Concetti relativi alle queryQuery Concepts