Condividi tramite


Esecuzione remota e locale

È possibile decidere di eseguire le query in modalità remota( ovvero il motore di database esegue la query sul database) o in locale (LINQ to SQL esegue la query su una cache locale).

Esecuzione remota

Si consideri la seguente interrogazione:

            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 è necessario recuperarle tutte per elaborare un piccolo subset. In LINQ to SQL la EntitySet<TEntity> classe implementa l'interfaccia IQueryable . Questo approccio assicura che tali query possano essere eseguite in modalità remota. Due vantaggi principali derivano da questa tecnica:

  • I dati non necessari non vengono recuperati.

  • Una query eseguita dal motore di database è spesso più efficiente a causa degli indici di database.

Esecuzione locale

In altre situazioni, potrebbe essere necessario avere il set completo di entità correlate nella cache locale. A questo scopo, EntitySet<TEntity> fornisce il Load metodo per caricare in modo esplicito tutti i membri di EntitySet<TEntity>.

Se un oggetto EntitySet<TEntity> è già caricato, le query successive vengono eseguite in locale. Questo approccio è utile in due modi:

  • Se il set completo deve essere usato in locale o più volte, è possibile evitare query remote e latenze associate.

  • L'entità può essere serializzata come entità completa.

Il frammento di codice seguente illustra come ottenere l'esecuzione locale:

            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

Confronto

Queste due funzionalità offrono una potente combinazione di opzioni: esecuzione remota per raccolte di grandi dimensioni ed esecuzione locale per raccolte di piccole dimensioni o in cui è necessaria la raccolta completa. L'esecuzione remota viene implementata tramite IQueryable, e l'esecuzione locale viene eseguita contro una raccolta in memoria IEnumerable<T>. Per forzare l'esecuzione locale (cioè IEnumerable<T>), vedere Convertire un tipo a un IEnumerable generico.

Query su set non ordinati

Si noti la differenza importante tra una raccolta locale che implementa List<T> e una raccolta che fornisce query remote eseguite su set non ordinati in un database relazionale. List<T> metodi come quelli che usano valori di indice richiedono semantica di elenco, che in genere non possono essere ottenuti tramite una query remota su un set non ordinato. Per questo motivo, tali metodi caricano in modo implicito il EntitySet<TEntity> per consentire l'esecuzione locale.

Vedere anche