Abfragen für eine einzelne Tabelle (LINQ to DataSet)

Aktualisiert: November 2007

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) fragt Arbeit an Datenquellen ab, die die IEnumerable<T>-Schnittstelle oder die IQueryable-Schnittstelle implementieren. Die DataTable-Klasse implementiert keine dieser beiden Schnittstellen, sodass Sie die AsEnumerable-Methode aufrufen müssen, wenn Sie die DataTable als Quelle in die From-Klausel einer LINQ-Abfrage aufnehmen möchten.

Das folgende Beispiel ruft alle Onlinebestellungen aus der Tabelle SalesOrderHeader ab und zeigt in der Konsole die Auftrags-ID, das Auftragsdatum und die Auftragsnummer an.

' 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 query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Select New With { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
     }

For Each onlineOrder In query
    Console.Write("Order ID: " & onlineOrder.SalesOrderID)
    Console.Write(" Order date: " & onlineOrder.OrderDate)
    Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

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

var query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    select new
    {
        SalesOrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate"),
        SalesOrderNumber = order.Field<string>("SalesOrderNumber")
    };

foreach (var onlineOrder in query)
{
    Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",
        onlineOrder.SalesOrderID,
        onlineOrder.OrderDate,
        onlineOrder.SalesOrderNumber);
}

Die Abfrage der lokalen Variable wird mit einem Abfrageausdruck initialisiert, der eine oder mehrere Informationsquellen abfragt, indem ein oder mehrere Abfrageoperatoren angewendet werden. Bei diesen Operatoren handelt es sich entweder um Standardabfrageoperatoren oder, im Fall von LINQ to DataSet, um Operatoren, die für die DataSet-Klasse spezifisch sind. Der Abfrageausdruck im vorherigen Beispiel verwendet zwei der Standardabfrageoperatoren: Where und Select.

Die Where-Klausel filtert die Reihenfolge auf der Basis einer Bedingung. In diesem Fall lautet die Bedingung, dass für OnlineOrderFlag der Wert true gilt. Der Select-Operator ordnet ein aufzählbares Objekt zu, das die an den Operator übergebenen Argumente erfasst, und gibt das Objekt zurück. Im Beispiel oben wird ein anonymer Typ mit drei Eigenschaften erstellt: SalesOrderID, OrderDate und SalesOrderNumber. Als Werte für diese drei Eigenschaften werden die Werte der Spalten SalesOrderID, OrderDate und SalesOrderNumber aus der SalesOrderHeader-Tabelle verwendet.

Die foreach-Schleife zählt dann das von Select zurückgegebene aufzählbare Objekt auf und gibt die Abfrageergebnisse aus. Da es sich bei der Abfrage um eine Enumerable-Abfrage handelt, die die IEnumerable<T>-Schnittstelle implementiert, wird die Auswertung der Abfrage so lange verzögert, bis die Abfragevariable mit der foreach-Schleife durchlaufen wird. Durch die verzögerte Abfrageauswertung können die Abfragen als Werte erhalten werden, die mehrere Male ausgewertet werden und dabei potenziell jedes Mal ein anderes Ergebnis erbringen können.

Die Field-Methode bietet Zugriff auf die Spaltenwerte einer DataRow, und das SetField (im Beispiel oben nicht dargestellt) gibt Spaltenwerte in einer DataRow an. Sowohl die Field-Methode als auch die SetField-Methode kümmern sich um Typen, die NULL zulassen, sodass die explizite Prüfung auf NULL-Werte entfallen kann. Beide Methoden sind darüber hinaus generische Methoden. Der Rückgabetyp muss also nicht umgewandelt werden. Sie könnten den schon vorhandenen Spaltenaccessor in DataRow (z. B. o["OrderDate"]) verwenden, müssten dann aber das Rückgabeobjekt in den entsprechenden Typ umwandeln. Wenn die Spalte auf NULL gesetzt werden kann, müssen Sie mit der IsNull-Methode prüfen, ob der Wert NULL ist. Weitere Informationen dazu finden Sie unter Generische Methoden 'Field' und 'SetField' (LINQ to DataSet).

Beachten Sie, dass der im generischen T-Parameter der Field-Methode und der SetField-Methode angegebene Datentyp mit dem Typ des zugrunde liegenden Werts übereinstimmen muss. Anderenfalls wird eine InvalidCastException ausgelöst. Der angegebene Spaltenname muss außerdem mit dem Namen einer DataSet-Spalte übereinstimmen. Wenn dies nicht der Fall ist, wird eine ArgumentException ausgelöst. Die Auslösung der Ausnahme erfolgt in beiden Fällen bei der Datenenumeration zur Laufzeit, wenn die Abfrage ausgeführt wird.

Siehe auch

Konzepte

Abfragen für mehrere Tabellen (LINQ to DataSet)

Abfragen von typisierten DataSets

Generische Methoden 'Field' und 'SetField' (LINQ to DataSet)