Share via


Comparación entre la ejecución remota y local de consultas (LINQ to SQL)

Actualización: November 2007

Puede decidir ejecutar las consultas de manera remota (es decir, el motor de base de datos ejecuta la consulta en la base de datos) o localmente (LINQ to SQL ejecuta la consulta en una memoria caché local).

Ejecución remota

Considere la siguiente consulta:

    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
            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.
}

Si su base de datos tuviese miles de filas de pedidos, no desearía recuperarlos todos para procesar un subconjunto pequeño. En LINQ to SQL, la clase EntitySet<TEntity> implementa la interfaz IQueryable. Este enfoque garantiza que ese tipo de consultas se puedan ejecutar de manera remota. De esta técnica se derivan dos ventajas principales:

  • No se recuperan datos innecesarios.

  • Una consulta ejecutada por el motor de base de datos suele ser más eficaz debido a los índices de la base de datos.

Ejecución local

En otras situaciones, podría desear tener el conjunto completo de entidades relacionadas en la memoria caché local. Para este propósito, EntitySet<TEntity> proporciona el método Load para cargar explícitamente todos los miembros de EntitySet<TEntity>.

Si EntitySet<TEntity> ya está cargado, las consultas posteriores se ejecutan localmente. Este enfoque ayuda en dos sentidos:

  • Si se debe utilizar el conjunto completo localmente o varias veces, puede evitar las consultas remotas y la latencia asociada a las mismas.

  • La entidad se puede serializar como una entidad completa.

El fragmento de código siguiente muestra cómo se puede obtener la ejecución local:

    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
            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.
}

        }

Comparación

Estas dos funciones proporcionan una combinación eficaz de opciones: ejecución remota para las colecciones grandes y ejecución local para las colecciones pequeñas o si se necesita la colección completa. La ejecución remota se implementa a través de IQueryable y la ejecución local en una colección IEnumerable<T> en memoria. Para forzar la ejecución local (es decir, IEnumerable<T>), vea Cómo: Convertir un tipo en datos IEnumerable genéricos (LINQ to SQL).

Consultas en conjuntos no ordenados

Observe la importante diferencia que existe entre una colección local que implementa List<T> y una colección que proporciona consultas remotas ejecutadas en conjuntos no ordenados en una base de datos relacional. Los métodos List<T>, como los que utilizan valores de índice, requieren semántica de lista, que normalmente no se puede obtener a través de una consulta remota en un conjunto no ordenado. Por esta razón, tales métodos cargan implícitamente EntitySet<TEntity> para permitir la ejecución local.

Vea también

Otros recursos

Conceptos de consulta en LINQ to SQL