Freigeben über


Tabellenübergreifende Abfragen (LINQ to DataSet)

Neben der Abfrage einer einzelnen Tabelle können Sie auch tabellenübergreifende Abfragen in LINQ to DataSet ausführen. Zu diesem Zweck wird ein Join verwendet. Eine Verknüpfung ist die Zuordnung von Objekten in einer Datenquelle mit Objekten, die ein gemeinsames Attribut in einer anderen Datenquelle gemeinsam nutzen, z. B. ein Produkt oder eine Kontakt-ID. Bei der objektorientierten Programmierung sind Beziehungen zwischen Objekten relativ einfach zu navigieren, da jedes Objekt über ein Element verfügt, das auf ein anderes Objekt verweist. In externen Datenbanktabellen ist die Navigation in Beziehungen jedoch nicht so einfach. Datenbanktabellen enthalten keine integrierten Beziehungen. In diesen Fällen kann der Verknüpfungsvorgang verwendet werden, um Elemente aus jeder Quelle abzugleichen. Wenn Sie z. B. zwei Tabellen mit Produktinformationen und Verkaufsinformationen enthalten, können Sie einen Verknüpfungsvorgang verwenden, um Verkaufsinformationen und Produkte für denselben Verkaufsauftrag abzugleichen.

Das Language-Integrated Query (LINQ)-Framework bietet zwei Verknüpfungsoperatoren Join und GroupJoin. Diese Operatoren führen Äquimverknüpfungen durch: d. h. Verknüpfungen, die nur dann mit zwei Datenquellen übereinstimmen, wenn ihre Schlüssel gleich sind. (Im Gegensatz dazu unterstützt Transact-SQL andere Verknüpfungsoperatoren als equals, z. B. den less than Operator.)

In der Terminologie relationaler Datenbanken implementiert Join eine innere Verknüpfung. Bei einer inneren Verknüpfung handelt es sich um einen Verknüpfungstyp, bei dem nur die Objekte zurückgegeben werden, die eine Übereinstimmung im gegenteiligen Dataset aufweisen.

Die GroupJoin Operatoren haben keine direkte Entsprechung in relationalen Datenbankbegriffen. Sie implementieren eine Obermenge von inneren Verknüpfungen und linken äußeren Verknüpfungen. Eine linke äußere Verknüpfung ist eine Verknüpfung, die jedes Element der ersten (linken) Auflistung zurückgibt, auch wenn es keine korrelierten Elemente in der zweiten Auflistung enthält.

Weitere Informationen zu Verknüpfungen finden Sie unter Join Operations.

Beispiel

Im folgenden Beispiel wird eine herkömmliche Verknüpfung der Tabellen SalesOrderHeader und SalesOrderDetail aus der AdventureWorks-Beispieldatenbank ausgeführt, um Onlinebestellungen für den Monat August abzurufen.

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

Siehe auch