Remoto vs. Execução de local
Você pode decidir executando remotamente (isto é, o mecanismo de banco de dados executa a consulta na base de dados) ou localmente suas consultas (LINQ to SQL executa a consulta em um cache local).
Execução remoto
Considere a consulta a seguir:
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
Se seu base de dados tem milhares de linhas de pedidos, você não deseja recuperá-los todos para processar um subconjunto pequeno. No LINQ to SQL, a classe EntitySet<TEntity> implementa a interface IQueryable. Essa abordagem certifique-se de que essas consultas podem ser executadas remotamente. Dois benefícios principais fluem dessa técnica:
Os dados desnecessários não são recuperados.
Uma consulta executada pelo mecanismo de base de dados geralmente é mais eficiente devido aos índices de base de dados.
Execução local
Em outras situações, convém ter o conjunto completo de entidades relacionadas no cache local. Essa finalidade, EntitySet<TEntity> fornece o método de Load para carregar explicitamente todos os membros de EntitySet<TEntity>.
Se EntitySet<TEntity> é carregado já, consultas subsequentes são executadas localmente. Essa abordagem ajuda em duas maneiras:
Se o conjunto completo deve ser usado localmente ou várias vezes, você pode evitar consultas e remotos latências associados.
A entidade pode ser serializada como uma entidade completo.
O fragmento de código a seguir ilustra como execução local pode ser obtida:
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
Comparação
Esses dois recursos fornecem uma combinação eficiente de opções: execução remoto para grandes coleções e execução local para coleções pequenas ou onde a coleção completa é necessária. Você implementa a execução remoto com IQueryable, e a execução local com uma coleção de memória de IEnumerable<T> . Para forçar a execução local (ou sejaIEnumerable<T>), confira Converter um tipo em um IEnumerable genérico.
Consultas em conjuntos não ordenada
Observe a diferença importante entre uma coleção local que implementa List<T> e uma coleção que fornece as consultas remotas executadas em conjuntos não ordenados em um banco de dados relacional. os métodos deList<T> como aqueles que usam valores de índice requerem a semântica da lista, que normalmente não pode ser obtida com uma consulta remoto com um conjunto não ordenada. Por esse motivo, esses métodos carregam implicitamente EntitySet<TEntity> para permitir a execução local.