Partilhar via


Consultas 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 corresponder 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 LINQ (Language-Integrated Query) fornece dois operadores Join de junção 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 outro lado, o Transact-SQL oferece suporte a operadores de junção diferentes de equals, como o less than operador.)

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 em termos de banco de dados relacional, eles implementam um superconjunto de junções internas e externas esquerdas. 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 SalesOrderHeader tabelas e SalesOrderDetail do banco de dados de exemplo AdventureWorks para obter pedidos online a partir 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("{0}\t{1}\t{2:d}\t{3}",
        order.SalesOrderID,
        order.SalesOrderDetailID,
        order.OrderDate,
        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

Consulte também