Ejecución remota o ejecución local
Puedes 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:
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 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:
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
De 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 Convertir un tipo en un IEnumerable genérico.
Consultas en conjuntos no ordenados
Observa 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.