Freigeben über


Abfragen für einzelne Tabellen (LINQ to DataSet)

LINQ-Abfragen (Language-Integrated Query) arbeiten an Datenquellen, die die IEnumerable<T>-Schnittstelle oder die IQueryable<T>-Schnittstelle implementieren. Die DataTable-Klasse implementiert keine Schnittstelle, daher müssen Sie die AsEnumerable-Methode aufrufen, wenn Sie die DataTable als Quelle in der From-Klausel einer LINQ-Abfrage verwenden 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.
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);
}
' 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

Die lokale Variablenabfrage wird mit einem Abfrageausdruck initialisiert, der auf einer oder mehreren Informationsquellen ausgeführt wird, indem ein oder mehrere Abfrageoperatoren entweder von den Standardabfrageoperatoren angewendet werden, oder im Fall von LINQ to DataSet 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 behandeln auf null festlegbare Werttypen, sodass Sie nicht explizit auf Nullwerte überprüfen müssen. Beide Methoden sind darüber hinaus generische Methoden. Der Rückgabetyp muss also nicht umgewandelt werden. Sie könnten die schon vorhandene Spaltenzugriffsmethode in DataRow (z. B. o["OrderDate"]) verwenden, müssten dann aber das Rückgabeobjekt in den entsprechenden Typ umwandeln. Wenn es sich bei der Spalte um einen Nullwerttyp handelt, müssen Sie überprüfen, ob der Wert null ist, indem Sie die IsNull-Methode verwenden. Weitere Informationen finden Sie unter generische Feld- und SetField-Methoden.

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