Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 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 o banco de dados tiver milhares de linhas de pedidos, você não deseja recuperá-las todas para processar um subconjunto pequeno. No LINQ to SQL, a classe EntitySet<TEntity> implementa a interface IQueryable. Essa abordagem garante que essas consultas possam ser executadas remotamente. Dois benefícios principais fluem dessa técnica:
Dados desnecessários não são recuperados.
Uma consulta executada pelo mecanismo de banco de dados geralmente é mais eficiente devido aos índices de banco de dados.
Execução local
Em outras situações, talvez você queira ter o conjunto completo de entidades relacionadas no cache local. Para essa finalidade, EntitySet<TEntity> fornece o Load método para carregar explicitamente todos os membros do EntitySet<TEntity>.
Se uma EntitySet<TEntity> já estiver carregada, as consultas subsequentes serão executadas localmente. Essa abordagem ajuda de duas maneiras:
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 combinação poderosa 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 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 seja, IEnumerable<T>), consulte Converter um tipo para 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 consultas remotas executadas em conjuntos não ordenados 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 um conjunto não ordenado. Por esse motivo, esses métodos carregam implicitamente o EntitySet<TEntity> para permitir a execução local.