Esecuzione e localeRemote vs. Local Execution

È possibile scegliere di eseguire le query in modalità remota, dove il motore di database esegue la query sul database, oppure localmente, dove LINQ to SQLLINQ to SQL esegue la query sulla cache locale.You can decide to execute your queries either remotely (that is, the database engine executes the query against the database) or locally (LINQ to SQLLINQ to SQL executes the query against a local cache).

Esecuzione remotaRemote Execution

Si consideri la query riportata di seguito:Consider the following query:

            Northwnd db = new Northwnd(@"northwnd.mdf");
            Customer c = db.Customers.Single(x => x.CustomerID == "19283");
foreach (Order ord in 
    c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
    // Do something.
}
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim c As Customer = _
(From cust In db.Customers _
Where cust.CustomerID = 19283).First()
    Dim orders = From ord In c.Orders _
        Where ord.ShippedDate.Value.Year = 1998
    For Each nextOrder In orders
        ' Do something.
    Next

Se nel database sono presenti migliaia di righe di ordini, non è opportuno recuperarli tutti per elaborare un piccolo subset.If your database has thousands of rows of orders, you do not want to retrieve them all to process a small subset. In LINQ to SQLLINQ to SQL la classe EntitySet<TEntity> implementa l'interfaccia IQueryable.In LINQ to SQLLINQ to SQL, the EntitySet<TEntity> class implements the IQueryable interface. Questo approccio assicura che tali query possano essere eseguite in modalità remota.This approach makes sure that such queries can be executed remotely. Questa tecnica offre due vantaggi principali:Two major benefits flow from this technique:

  • I dati non necessari non vengono recuperati.Unnecessary data is not retrieved.

  • Una query eseguita dal motore di database è spesso più efficiente grazie agli indici del database.A query executed by the database engine is often more efficient because of the database indexes.

e localeLocal Execution

In altre situazioni può essere necessario disporre del set completo di entità correlate nella cache locale.In other situations, you might want to have the complete set of related entities in the local cache. A questo scopo EntitySet<TEntity> fornisce il metodo Load per caricare in modo esplicito tutti i membri di EntitySet<TEntity>.For this purpose, EntitySet<TEntity> provides the Load method to explicitly load all the members of the EntitySet<TEntity>.

Se EntitySet<TEntity> è già caricato, le query successive vengono eseguite localmente.If an EntitySet<TEntity> is already loaded, subsequent queries are executed locally. Questo approccio risulta utile in due modi:This approach helps in two ways:

  • Se il set completo deve essere usato localmente o più volte, è possibile evitare l'esecuzione di query remote e le latenze che ne derivano.If the complete set must be used locally or multiple times, you can avoid remote queries and associated latencies.

  • L'entità può essere serializzata come un'entità completa.The entity can be serialized as a complete entity.

Il frammento di codice seguente illustra come è possibile ottenere l'esecuzione locale:The following code fragment illustrates how local execution can be obtained:

            Northwnd db = new Northwnd(@"northwnd.mdf");
            Customer c = db.Customers.Single(x => x.CustomerID == "19283");
c.Orders.Load();

foreach (Order ord in 
    c.Orders.Where(o => o.ShippedDate.Value.Year == 1998))
{
    // Do something.
}

        }
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim c As Customer = _
(From cust In db.Customers _
 Where cust.CustomerID = 19283).First
    c.Orders.Load()

    Dim orders = From ord In c.Orders _
        Where ord.ShippedDate.Value.Year = 1998

    For Each nextOrder In orders
        ' Do something.
    Next

ConfrontoComparison

Queste due funzionalità consentono di ottenere una potente combinazione di opzioni: l'esecuzione remota per le raccolte di grandi dimensioni e l'esecuzione locale per le piccole raccolte o dove è necessario disporre della raccolta completa.These two capabilities provide a powerful combination of options: remote execution for large collections and local execution for small collections or where the complete collection is needed. L'esecuzione remota viene implementata tramite IQueryable, mentre l'esecuzione locale viene implementata su una raccolta IEnumerable<T> in memoria.You implement remote execution through IQueryable, and local execution against an in-memory IEnumerable<T> collection. Per forzare l'esecuzione locale (ovvero, IEnumerable<T>), vedere convertire un tipo in un IEnumerable generico.To force local execution (that is, IEnumerable<T>), see Convert a Type to a Generic IEnumerable.

Query su set non ordinatiQueries Against Unordered Sets

Notare l'importante differenza tra una raccolta locale che implementa List<T> e una raccolta che fornisce query remote eseguite su insiemi non ordinati in un database relazionale.Note the important difference between a local collection that implements List<T> and a collection that provides remote queries executed against unordered sets in a relational database. I metodi List<T>, ad esempio quelli che usano valori di indice, richiedono la semantica di elenco che in genere non può essere ottenuta tramite una query remota su un set non ordinato.List<T> methods such as those that use index values require list semantics, which typically cannot be obtained through a remote query against an unordered set. Per questo motivo, tali metodi caricano in modo implicito EntitySet<TEntity> per consentire l'esecuzione locale.For this reason, such methods implicitly load the EntitySet<TEntity> to allow local execution.

Vedere ancheSee Also

Concetti relativi alle queryQuery Concepts