Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.