Compartilhar via


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.

Confira também