Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine Abfrage ist ein Ausdruck, der Daten aus einer Datenquelle abruft. Abfragen werden in der Regel in einer speziellen Abfragesprache ausgedrückt, z. B. SQL für relationale Datenbanken und XQuery für XML. Daher mussten Entwickler eine neue Abfragesprache für jeden Typ von Datenquelle oder Datenformat erlernen, den sie abfragen. Language-Integrated Query (LINQ) bietet ein einfacheres, konsistentes Modell zum Arbeiten mit Daten über verschiedene Arten von Datenquellen und -formaten hinweg. In einer LINQ-Abfrage arbeiten Sie immer mit Programmierobjekten.
Ein LINQ-Abfragevorgang besteht aus drei Aktionen: Abrufen der Datenquelle oder Quellen, Erstellen der Abfrage und Ausführen der Abfrage.
Datenquellen, die die IEnumerable<T> generische Schnittstelle implementieren, können über LINQ abgefragt werden. Beim Aufrufen von AsEnumerable auf einem DataTable wird ein Objekt zurückgegeben, das die generische IEnumerable<T> Schnittstelle implementiert und als Datenquelle für LINQ to DataSet-Abfragen dient.
In der Abfrage geben Sie genau die Informationen an, die Sie aus der Datenquelle abrufen möchten. Eine Abfrage kann auch angeben, wie diese Informationen sortiert, gruppiert und geformt werden sollen, bevor sie zurückgegeben wird. In LINQ wird eine Abfrage in einer Variablen gespeichert. Wenn die Abfrage so konzipiert ist, dass eine Abfolge von Werten zurückgegeben wird, muss die Abfragevariable selbst ein aufzählbarer Typ sein. Diese Abfragevariable führt keine Aktion aus und gibt keine Daten zurück. es speichert nur die Abfrageinformationen. Nachdem Sie eine Abfrage erstellt haben, müssen Sie diese Abfrage ausführen, um daten abzurufen.
In einer Abfrage, die eine Abfolge von Werten zurückgibt, enthält die Abfragevariable selbst niemals die Abfrageergebnisse und speichert nur die Abfragebefehle. Die Ausführung der Abfrage wird zurückgestellt, bis die Abfragevariable in einer foreach
oder For Each
Schleife durchlaufen wird. Dies wird als verzögerte Ausführung bezeichnet; d. h. die Abfrageausführung erfolgt einige Zeit, nachdem die Abfrage erstellt wurde. Dies bedeutet, dass Sie eine Abfrage so oft ausführen können, wie Sie möchten. Dies ist nützlich, wenn Sie beispielsweise über eine Datenbank verfügen, die von anderen Anwendungen aktualisiert wird. In Ihrer Anwendung können Sie eine Abfrage erstellen, um die neuesten Informationen abzurufen und die Abfrage wiederholt auszuführen und die aktualisierten Informationen jedes Mal zurückzugeben.
Im Gegensatz zu verzögerten Abfragen, die eine Abfolge von Werten zurückgeben, werden Abfragen, die einen Singletonwert zurückgeben, sofort ausgeführt. Einige Beispiele für Singleton-Abfragen sind Count, , Max, Averageund First. Diese werden sofort ausgeführt, da die Abfrageergebnisse zum Berechnen des Singletonergebnisses erforderlich sind. Um beispielsweise den Mittelwert der Abfrageergebnisse zu ermitteln, muss die Abfrage ausgeführt werden, damit die Durchschnittlichkeitsfunktion Eingabedaten enthält, mit denen sie arbeiten können. Sie können auch die ToList Methoden oder ToArray Methoden für eine Abfrage verwenden, um die sofortige Ausführung einer Abfrage zu erzwingen, die keinen Singletonwert erzeugt. Diese Techniken zum Erzwingen der sofortigen Ausführung können nützlich sein, wenn Sie die Ergebnisse einer Abfrage zwischenspeichern möchten.
Fragen
LINQ to DataSet-Abfragen können in zwei verschiedenen Syntaxen formuliert werden: Abfrageausdruckssyntax und methodenbasierte Abfragesyntax.
Abfrageausdruckssyntax
Abfrageausdrücke sind eine deklarative Abfragesyntax. Mit dieser Syntax kann ein Entwickler Abfragen in C# oder Visual Basic in einem ähnlichen Format wie SQL schreiben. Mithilfe der Abfrageausdruckssyntax können Sie sogar komplexe Filter-, Sortier- und Gruppierungsvorgänge für Datenquellen mit minimalem Code ausführen. Weitere Informationen finden Sie unter LINQ Query Expressions and Basic Query Operations (Visual Basic).
Die Common Language Runtime (CLR) von .NET Framework kann die Abfrageausdrucksyntax selbst nicht lesen. Daher werden Abfrageausdrücke (Query Expressions) während der Kompilierungszeit in etwas übersetzt, das der CLR versteht: Methodenaufrufe. Diese Methoden werden als Standardabfrageoperatoren bezeichnet. Als Entwickler haben Sie die Möglichkeit, sie direkt mithilfe der Methodensyntax anstelle der Abfragesyntax aufzurufen. Weitere Informationen finden Sie unter Abfragesyntax und Methodensyntax in LINQ. Weitere Informationen zu den Standardabfrageoperatoren finden Sie unter "Übersicht über Standardabfrageoperatoren".
In den folgenden Beispielen wird die Select-Methode verwendet, um alle Zeilen aus der Product
-Tabelle zurückzugeben und die Produktnamen anzuzeigen.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> query =
from product in products.AsEnumerable()
select product;
Console.WriteLine("Product Names:");
foreach (DataRow p in query)
{
Console.WriteLine(p.Field<string>("Name"));
}
' 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 products As DataTable = ds.Tables("Product")
Dim query = From product In products.AsEnumerable() _
Select product
Console.WriteLine("Product Names:")
For Each p In query
Console.WriteLine(p.Field(Of String)("Name"))
Next
Methodenbasierte Abfragesyntax
Die andere Möglichkeit zum Formulieren von LINQ to DataSet-Abfragen ist die Verwendung methodenbasierter Abfragen. Die methodenbasierte Abfragesyntax ist eine Sequenz von direkten Methodenaufrufen an LINQ-Operatormethoden, wobei Lambda-Ausdrücke als Parameter übergeben werden. Weitere Informationen finden Sie unter Lambda-Ausdrücke.
Um alle Zeilen von Select zurückzugeben und die Produktnamen anzuzeigen, wird in diesem Beispiel Product
verwendet.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
var query = products.AsEnumerable().
Select(product => new
{
ProductName = product.Field<string>("Name"),
ProductNumber = product.Field<string>("ProductNumber"),
Price = product.Field<decimal>("ListPrice")
});
Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
Console.WriteLine($"Product name: {productInfo.ProductName} Product number: {productInfo.ProductNumber} List price: ${productInfo.Price} ");
}
' 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 products As DataTable = ds.Tables("Product")
Dim query = products.AsEnumerable() _
.Select(Function(product As DataRow) New With _
{ _
.ProductName = product.Field(Of String)("Name"), _
.ProductNumber = product.Field(Of String)("ProductNumber"), _
.Price = product.Field(Of Decimal)("ListPrice") _
})
Console.WriteLine("Product Info:")
For Each product In query
Console.Write("Product name: " & product.ProductName)
Console.Write("Product number: " & product.ProductNumber)
Console.WriteLine("List price: $ " & product.Price)
Next
Verfassen von Abfragen
Wie weiter oben in diesem Thema erwähnt, speichert die Abfragevariable selbst nur die Abfragebefehle, wenn die Abfrage so konzipiert ist, dass eine Abfolge von Werten zurückgegeben wird. Wenn die Abfrage keine Methode enthält, die eine sofortige Ausführung verursacht, wird die tatsächliche Ausführung der Abfrage zurückgestellt, bis Sie die Abfragevariable in einer foreach
oder For Each
Schleife durchlaufen. Bei verzögerter Ausführung können mehrere Abfragen kombiniert oder eine Abfrage erweitert werden. Wenn eine Abfrage erweitert wird, wird sie so geändert, dass sie die neuen Vorgänge enthält, und die spätere Ausführung spiegelt die Änderungen wider. Im folgenden Beispiel gibt die erste Abfrage alle Produkte zurück. Die zweite Abfrage erweitert die erste, indem sie Where
nutzt, um alle Produkte der Größe "L" zurückzugeben.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> productsQuery =
from product in products.AsEnumerable()
select product;
IEnumerable<DataRow> largeProducts =
productsQuery.Where(p => p.Field<string>("Size") == "L");
Console.WriteLine("Products of size 'L':");
foreach (DataRow product in largeProducts)
{
Console.WriteLine(product.Field<string>("Name"));
}
' 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 products As DataTable = ds.Tables("Product")
Dim productsQuery = From product In products.AsEnumerable() _
Select product
Dim largeProducts = _
productsQuery.Where(Function(p) p.Field(Of String)("Size") = "L")
Console.WriteLine("Products of size 'L':")
For Each product In largeProducts
Console.WriteLine(product.Field(Of String)("Name"))
Next
Nachdem eine Abfrage ausgeführt wurde, können keine zusätzlichen Abfragen verfasst werden, und alle nachfolgenden Abfragen verwenden die LINQ-Operatoren im Arbeitsspeicher. Die Abfrageausführung erfolgt, wenn Sie über die Abfragevariable in einer foreach
- oder For Each
-Anweisung iterieren oder indem Sie einen der LINQ-Konvertierungsoperatoren aufrufen, der eine sofortige Ausführung verursacht. Zu diesen Operatoren gehören: ToList, , ToArray, ToLookupund ToDictionary.
Im folgenden Beispiel gibt die erste Abfrage alle Produkte zurück, die nach Listenpreis bestellt wurden. Die ToArray Methode wird verwendet, um die sofortige Abfrageausführung zu erzwingen:
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable products = ds.Tables["Product"];
IEnumerable<DataRow> query =
from product in products.AsEnumerable()
orderby product.Field<Decimal>("ListPrice") descending
select product;
// Force immediate execution of the query.
IEnumerable<DataRow> productsArray = query.ToArray();
Console.WriteLine("Every price from highest to lowest:");
foreach (DataRow prod in productsArray)
{
Console.WriteLine(prod.Field<Decimal>("ListPrice"));
}
' 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 products As DataTable = ds.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice") Descending _
Select product
' Force immediate execution of the query.
Dim productsArray = query.ToArray()
Console.WriteLine("Every price From highest to lowest:")
For Each prod In productsArray
Console.WriteLine(prod.Field(Of Decimal)("ListPrice"))
Next