Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Language-Integrated Abfragen (LINQ) arbeiten mit 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 Methode als Quelle in der From Klausel einer LINQ-Abfrage verwenden möchten.
Im folgenden Beispiel werden alle Onlineaufträge aus der Tabelle "SalesOrderHeader" abgerufen und die Auftrags-ID, das Bestelldatum und die Bestellnummer an die Konsole ausgegeben.
// 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: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {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 sie einen oder mehrere Abfrageoperatoren entweder von den Standardabfrageoperatoren oder im Fall von LINQ to DataSet, Operatoren, die für die DataSet Klasse spezifisch sind, anwenden. Der Abfrageausdruck im vorherigen Beispiel verwendet zwei der Standardabfrageoperatoren: Where und Select.
Die Where-Bedingung filtert die Sequenz basierend auf einer Bedingung, in diesem Fall, dass OnlineOrderFlag auf true gesetzt ist. Der Select Operator weist ein aufzählbares Objekt zu und gibt es zurück, das die an den Operator übergebenen Argumente erfasst. In diesem obigen Beispiel wird ein anonymer Typ mit drei Eigenschaften erstellt: SalesOrderID, , OrderDateund SalesOrderNumber. Die Werte dieser drei Eigenschaften werden auf die Werte von SalesOrderID, OrderDateund SalesOrderNumber Spalten aus der SalesOrderHeader Tabelle festgelegt.
Die foreach Schleife enumiert dann das vom Select zurückgegebene aufzählbare Objekt und gibt die Abfrageergebnisse zurück. 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. Mit der verzögerten Abfrageauswertung können Abfragen als Werte aufbewahrt werden, die mehrmals ausgewertet werden können, wobei jedes Mal unterschiedliche Ergebnisse erzielt werden.
Die Field Methode ermöglicht den Zugriff auf die Spaltenwerte eines DataRow und die SetField (nicht im vorherigen Beispiel gezeigt) legt Spaltenwerte in einem DataRow fest. Sowohl die Methoden Field als auch die SetField Methoden behandeln nullable Werttypen, daher müssen Sie nicht explizit auf NULL-Werte überprüfen. Beide Methoden sind generische Methoden, was auch bedeutet, dass Sie den Rückgabetyp nicht casten müssen. Sie könnten den bereits vorhandenen Spaltenaccessor in DataRow verwenden (z. B. o["OrderDate"]), aber dadurch wird es erforderlich, dass Sie 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 Generic Field and SetField Methods.
Beachten Sie, dass der im generischen Parameter T der Field-Methode und 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. In beiden Fällen wird die Ausnahme bei der Laufzeitdatenaufzählung ausgelöst, wenn die Abfrage ausgeführt wird.