Partilhar via


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.

Consulte também