Partilhar via


Consultas cruzadas entre tabelas (LINQ to DataSet)

Além de consultar uma única tabela, você também pode executar consultas entre tabelas no LINQ to DataSet. Isso é feito usando uma junção. Uma associação é a associação de objetos em uma fonte de dados com objetos que compartilham um atributo comum em outra fonte de dados, como um produto ou ID de contato. Na programação orientada a objetos, as relações entre objetos são relativamente fáceis de navegar porque cada objeto tem um membro que faz referência a outro objeto. Em tabelas de banco de dados externas, no entanto, navegar por relacionamentos não é tão simples. As tabelas de banco de dados não contêm relações internas. Nesses casos, a operação de junção pode ser usada para associar elementos de cada fonte. Por exemplo, dadas duas tabelas que contêm informações sobre produtos e informações de vendas, você pode usar uma operação de junção para fazer a correspondência entre informações de vendas e produtos para a mesma ordem de venda.

A estrutura Language-Integrated Query (LINQ) fornece dois operadores de junção, Join e GroupJoin. Esses operadores executam equi-joins: ou seja, junções que correspondem a duas fontes de dados somente quando suas chaves são iguais. (Por contraste, Transact-SQL suporta operadores de junção diferentes de equals, como o operador less than.)

Em termos de banco de dados relacional, Join implementa uma junção interna. Uma junção interna é um tipo de junção na qual apenas os objetos que têm uma correspondência no conjunto de dados oposto são retornados.

Os GroupJoin operadores não têm equivalente direto nos termos de bases de dados relacionais, e eles implementam um superconjunto de junções internas e junções externas à esquerda. Uma junção externa esquerda é uma junção que retorna cada elemento da primeira coleção (esquerda), mesmo que não tenha elementos correlacionados na segunda coleção.

Para obter mais informações sobre junções, consulte Operações de ingresso.

Exemplo

O exemplo a seguir executa uma junção tradicional das tabelas SalesOrderHeader e SalesOrderDetail do banco de dados de exemplo AdventureWorks para obter pedidos online do mês de agosto.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];
DataTable details = ds.Tables["SalesOrderDetail"];

var query =
    from order in orders.AsEnumerable()
    join detail in details.AsEnumerable()
    on order.Field<int>("SalesOrderID") equals
        detail.Field<int>("SalesOrderID")
    where order.Field<bool>("OnlineOrderFlag") == true
    && order.Field<DateTime>("OrderDate").Month == 8
    select new
    {
        SalesOrderID =
            order.Field<int>("SalesOrderID"),
        SalesOrderDetailID =
            detail.Field<int>("SalesOrderDetailID"),
        OrderDate =
            order.Field<DateTime>("OrderDate"),
        ProductID =
            detail.Field<int>("ProductID")
    };

foreach (var order in query)
{
    Console.WriteLine($"{order.SalesOrderID}\t{order.SalesOrderDetailID}\t{order.OrderDate:d}\t{order.ProductID}");
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")


Dim query = _
    From order In orders.AsEnumerable() _
    Join detail In details.AsEnumerable() _
    On order.Field(Of Integer)("SalesOrderID") Equals _
            detail.Field(Of Integer)("SalesOrderID") _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
            order.Field(Of DateTime)("OrderDate").Month = 8 _
    Select New With _
    { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .ProductID = detail.Field(Of Integer)("ProductID") _
    }

For Each order In query
    Console.WriteLine(order.SalesOrderID & vbTab & _
        order.SalesOrderDetailID & vbTab & _
        order.OrderDate & vbTab & _
        order.ProductID)
Next

Ver também