Execução remota vs. local
Você pode decidir executar suas consultas remotamente (ou seja, o mecanismo de banco de dados executa a consulta no banco de dados) ou localmente (LINQ to SQL executa a consulta em um cache local).
Execução remota
Considere a seguinte 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
Se o seu banco de dados tiver milhares de linhas de pedidos, você não deseja recuperá-los todos para processar um pequeno subconjunto. No LINQ to SQL, a EntitySet<TEntity> classe implementa a IQueryable interface. Essa abordagem garante que essas consultas possam ser executadas remotamente. Dois grandes benefícios decorrem desta técnica:
Os dados desnecessários não são recuperados.
Uma consulta executada pelo mecanismo de banco de dados geralmente é mais eficiente por causa dos índices do banco de dados.
Execução Local
Em outras situações, talvez você queira ter o conjunto completo de entidades relacionadas no cache local. Para este propósito, EntitySet<TEntity> fornece o Load método para carregar explicitamente todos os membros do EntitySet<TEntity>.
Se um EntitySet<TEntity> já estiver carregado, as consultas subsequentes serão executadas localmente. Esta abordagem ajuda de duas formas:
Se o conjunto completo precisar ser usado localmente ou várias vezes, você poderá evitar consultas remotas e latências associadas.
A entidade pode ser serializada como uma entidade completa.
O fragmento de código a seguir ilustra como a 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 poderosa combinação de opções: execução remota para grandes coleções e execução local para pequenas coleções ou onde a coleção completa é necessária. Você implementa a execução remota por meio do IQueryablee a execução local em uma coleção na memória IEnumerable<T> . Para forçar a execução local (ou seja, IEnumerable<T>), consulte Converter um tipo em um IEnumerable genérico.
Consultas em conjuntos não ordenados
Observe a diferença importante entre uma coleção local que implementa e uma coleção que fornece consultas remotas executadas em conjuntos não ordenados List<T> em um banco de dados relacional. List<T> Métodos como aqueles que usam valores de índice exigem semântica de lista, que normalmente não pode ser obtida por meio de uma consulta remota em relação a um conjunto não ordenado. Por esta razão, tais métodos carregam implicitamente o para permitir a EntitySet<TEntity> execução local.