Compartir a través de


Ejecución remota frente a ejecución local

Puede decidir ejecutar las consultas de forma 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 caché local).

Ejecución remota

Considere la consulta siguiente:

            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

Si la base de datos tiene miles de filas de pedidos, no desea recuperarlas todas para procesar un subconjunto pequeño. En LINQ to SQL, la EntitySet<TEntity> clase implementa la IQueryable interfaz . Este enfoque garantiza que estas consultas se puedan ejecutar de forma remota. Dos ventajas principales fluyen de esta técnica:

  • 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 base de datos.

Ejecución local

En otras situaciones, es posible que desee tener el conjunto completo de entidades relacionadas en la memoria caché local. Para ello, EntitySet<TEntity> proporciona el método Load para cargar explícitamente todos los miembros de EntitySet<TEntity>.

Si ya se ha cargado EntitySet<TEntity>, las consultas posteriores se ejecutan localmente. Este enfoque ayuda de dos maneras:

  • Si el conjunto completo se debe usar localmente o varias veces, puede evitar consultas remotas y latencias asociadas.

  • La entidad se puede serializar como una entidad completa.

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

            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

Comparación

Estas dos funcionalidades proporcionan una combinación eficaz de opciones: ejecución remota para colecciones grandes y ejecución local para colecciones pequeñas o donde se necesita la recopilación completa. Implementas la ejecución remota a través de IQueryable y la ejecución local contra una colección en memoria IEnumerable<T>. Para forzar la ejecución local (es decir, IEnumerable<T>), vea Convertir un tipo en un IEnumerable genérico.

Consultas en conjuntos no ordenados

Tenga en cuenta la diferencia importante entre una colección local que implementa List<T> y una que ofrece consultas remotas ejecutadas contra conjuntos no ordenados en una base de datos relacional. List<T> Los métodos como los que usan valores de índice requieren semántica de lista, que normalmente no se puede obtener a través de una consulta remota en un conjunto sin ordenar. Por este motivo, estos métodos cargan implícitamente el EntitySet<TEntity> para permitir la ejecución local.

Consulte también