Consulte através das relações

Referências a outros objetos ou coleções de outros objetos em suas definições de classe correspondem diretamente às relações de chave estrangeira na base de dados. Você pode usar estas relações quando você consulta usando notação de ponto para acessar as propriedades de relação e para navegar de um objeto para outro. Essas operações de acesso a traduzem mais complexo join ou correlacionaram a subconsultas no equivalente SQL.

Por exemplo, a consulta a seguir navega pedidos para clientes como uma maneira de restringir os resultados apenas 2 os pedidos de clientes localizados em Londres.

        Northwnd db = new Northwnd(@"northwnd.mdf");

        IQueryable<Order> londonOrderQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londonOrderQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord

Se as propriedades do relacionamento não existia você teria que escrevê-las manualmente como joins, exatamente como você faria em uma consulta SQL, como no código a seguir:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        IQueryable<Order> londonOrderQuery =
from cust in db.Customers
join ord in db.Orders on cust.CustomerID equals ord.CustomerID
where cust.City == "London"
select ord;
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim londOrderQuery = _
From cust In db.Customers _
Join ord In db.Orders On cust.CustomerID Equals ord.CustomerID _
Select ord

Você pode usar a propriedade de relação para definir esse relacionamento específico uma vez. Você pode usar a sintaxe mais conveniente de ponto. Mas as propriedades de relação existem mais importante porque os modelos de objeto domínio específicos geralmente são definidos como hierarquias ou elementos gráficos. Os objetos que você programou com têm referências a outros objetos. É apenas uma coincidência felizmente que as relações de objeto-à- objeto correspondem às relações estrangeiro-chave- estilo em bases de dados. Acesso da propriedade em fornece uma maneira conveniente de escrever join.

Em relação a isso, as propriedades da relação são mais importantes no lado dos resultados de uma consulta de como parte da consulta própria. Depois que a consulta recuperou dados sobre um determinado cliente, a definição de classe indica que os clientes têm pedidos. Ou você espera é a propriedade de Orders de um cliente específico ser uma coleção que é preenchida com todos os pedidos do cliente. Isso é fato do contrato que você declarou definindo classes dessa maneira. Você espera consulte existem os pedidos mesmo se a consulta não solicitou pedidos. Você espera seu modelo de objeto manter uma ilusão que é uma extensão de memória de base de dados com objetos relacionados imediatamente disponíveis.

Agora que você tem relações, você pode escrever consultas com referência às propriedades de relação definidas em suas classes. Essas referências de relação correspondem às relações de chave estrangeira na base de dados. As operações que usam essas relações traduzem a mais complexo ingressar no equivalente SQL. Como você tiver definido uma relação (usando o atributo de AssociationAttribute), você não precisará codificar um join explícito em LINQ to SQL.

Para ajudar a manter essa ilusão, LINQ to SQL implementa uma técnica chamada carregamento adiada. Para obter mais informações, confira Carregamento adiado versus imediato.

Considere a seguinte consulta SQL projetar uma lista de pares CustomerID-OrderID:

SELECT t0.CustomerID, t1.OrderID  
FROM   Customers AS t0 INNER JOIN  
          Orders AS t1 ON t0.CustomerID = t1.CustomerID  
WHERE  (t0.City = @p0)  

Para obter os mesmos resultados usando LINQ to SQL, você usa a referência de propriedade Orders já que existe na classe Customer. A referência Orders fornece as informações necessárias para executar a consulta e para projetar os pares CustomerID-OrderID, como no código a seguir:

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select new { cust.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select cust.CustomerID, ord.OrderID

Você também pode fazer o inverso. Isto é, você pode ver Orders e usar sua referência de relação de Customer para acessar informações sobre o objeto associado de Customer . O código a seguir projeta os mesmos pares CustomerID-OrderID que antes, mas dessa vez consultando Orders em vez de Customers.

        Northwnd db = new Northwnd(@"northwnd.mdf");
        var idQuery =
from ord in db.Orders
where ord.Customer.City == "London"
select new { ord.Customer.CustomerID, ord.OrderID };
    Dim db As New Northwnd("c:\northwnd.mdf")
    Dim idQuery = _
From ord In db.Orders _
Where ord.Customer.City = "London" _
Select ord.CustomerID, ord.OrderID

Confira também