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