Requêtes croisées entre tables (LINQ to DataSet)

Outre l’interrogation d’une seule table, vous pouvez également effectuer des requêtes inter-tables dans LINQ to DataSet. Pour cela, vous devez utiliser une jointure. Une jointure est l’association d’objets d’une source de données à des objets qui partagent un attribut commun dans une autre source de données, comme un produit ou un ID de contact. Dans la programmation orientée objet, les relations entre les objets sont relativement faciles à naviguer, car chaque objet a un membre qui fait référence à un autre objet. Dans les tables de base de données externes, toutefois, la navigation dans les relations n’est pas aussi simple. Les tables de base de données ne contiennent pas de relations intégrées. Dans ces cas, l’opération de jointure peut être utilisée pour faire correspondre des éléments de chaque source. Par exemple, étant donné deux tables qui contiennent des informations sur les produits et des informations de vente, vous pouvez utiliser une opération de jointure pour faire correspondre les informations de vente et les produits pour la même commande.

L’infrastructure Language-Integrated Query (LINQ) fournit deux opérateurs de jointure, Join et GroupJoin. Ces opérateurs effectuent des équi-jointures : ce sont les jointures qui correspondent à deux sources de données uniquement lorsque leurs clés sont égales. (En revanche, Transact-SQL prend en charge les opérateurs de jointure autres que equals, tels que l’opérateur less than .)

En termes de base de données relationnelle, Join implémente une jointure interne. Une jointure interne est un type de jointure dans lequel seuls les objets qui ont une correspondance dans le jeu de données opposé sont retournés.

Les opérateurs GroupJoin n’ont aucun équivalent direct en termes de base de données relationnelle ; ils implémentent un sur-ensemble de jointures internes et de jointures externes gauches. Une jointure externe gauche est une jointure qui retourne chaque élément de la première collection (gauche), même si elle n’a aucun élément corrélé dans la deuxième collection.

Pour plus d’informations sur les jointures, consultez Opérations de jointure.

Exemple :

L’exemple suivant effectue une jointure traditionnelle des tables SalesOrderHeader et SalesOrderDetail de la base de données d'exemple AdventureWorks pour obtenir des commandes en ligne du mois d’août.

// 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

Voir aussi