LINQ-Abfrageausdrücke (C#-Programmierhandbuch)
Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) ist der Name für einen Satz an Technologien, die auf der direkten Integration von Abfragefunktionen in die C#-Programmiersprache (sowie in Visual Basic und potenziell auch in andere .NET-Sprachen) basieren.In LINQ entspricht eine Abfrage nun einem erstklassigen Sprachkonstrukt, ebenso wie Klassen, Methoden, Ereignisse usw.
Für Entwickler, die Abfragen schreiben, ist der sichtbarste "sprachintegrierte" Teil von LINQ der Abfrageausdruck.Abfrageausdrücke werden in einer deklarativen Abfragesyntax geschrieben, die in C# 3.0 eingeführt wurde.Die Abfragesyntax ermöglicht die Ausführung komplexer Filter-, Sortier- und Gruppiervorgänge mit minimalem Codeeinsatz.Sie verwenden dieselben grundlegenden Abfrageausdrucksmuster zum Abfragen und Transformieren von Daten SQL-Datenbanken, ADO.NET-Datasets, XML-Dokumenten und -Streams sowie .NET-Auflistungen.
Das folgende Beispiel zeigt die vollständige Abfrageoperation.Der vollständige Vorgang umfasst die Erstellung einer Datenquelle, die Definition des Abfrageausdrucks und die Ausführung der Abfrage in einer foreach-Anweisung.
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
Weitere Informationen über die Grundlagen von LINQ in C# finden Sie unter Erste Schritte mit LINQ in C#.
Übersicht über Abfrageausdrücke
Abfrageausdrücke können verwendet werden, um Daten von einer LINQ-aktivierten Datenquelle abzufragen und zu transformieren.Eine einzelne Abfrage kann beispielsweise Daten aus einer SQL-Datenbank abrufen und als Ausgabe einen XML-Stream erzeugen.
Der Umgang mit Abfrageausdrücken ist nicht schwer zu erlernen, da sie viele vertraute C#-Sprachkonstrukte verwenden.Weitere Informationen finden Sie unter Erste Schritte mit LINQ in C#.
Die Variablen in einem Abfrageausdruck sind alle stark typisiert, obwohl Sie in vielen Fällen den Typ nicht explizit angeben müssen, da der Compiler ihn ableiten kann.Weitere Informationen finden Sie unter Typbeziehungen in LINQ-Abfragevorgängen (C#).
Die Abfrage wird so lange nicht ausgeführt, bis Sie die Abfragevariable in einer foreach-Anweisung durchlaufen.Weitere Informationen hierzu finden Sie unter Einführung in LINQ-Abfragen (C#).
Abfrageausdrücke werden bei der Kompilierung gemäß den Regeln der C#-Spezifikation in Standardabfrageoperator-Methodenaufrufe konvertiert.Abfragen, die durch eine Abfragesyntax ausgedrückt werden können, können auch mit der Methodensyntax ausgedrückt werden.In den meisten Fällen ist die Abfragesyntax jedoch leichter lesbar und präziser.Weitere Informationen finden Sie unter C#-Sprachspezifikation und unter Übersicht über Standardabfrageoperatoren.
Als Regel gilt: Wenn Sie LINQ-Abfragen schreiben, ist es empfehlenswert, dass Sie wenn immer möglich die Abfragesyntax und wenn immer notwendig die Methodensyntax verwenden.Es gibt keinen Semantik- oder Leistungsunterschied zwischen den beiden.Abfrageausdrücke sind oft leichter lesbar als entsprechende in Methodensyntax geschriebene Ausdrücke.
Einige Abfrageoperationen, z. B. Count oder Max, haben keine entsprechende Abfrageausdruckklausel und müssen daher als Methodenaufruf ausgedrückt werden.Die Methodensyntax kann auf verschiedene Weisen mit der Abfragesyntax kombiniert werden.Weitere Informationen finden Sie unter Abfragesyntax und Methodensyntax in LINQ (C#).
Abfrageausdrücke können je nach dem Typ, auf den die Abfrage angewendet wird, zu Ausdrucksbaumstrukturen oder zu Delegaten kompiliert werden.IEnumerable<T>-Abfragen werden zu Delegaten kompiliert.IQueryable-Abfragen und IQueryable<T>-Abfragen werden zu Ausdrucksbaumstrukturen kompiliert.Weitere Informationen finden Sie unter Ausdrucksbaumstrukturen (C# und Visual Basic).
In der folgenden Tabelle werden Themen, die weitere Informationen über Abfragen und Codebeispiele für häufige Aufgaben enthalten, aufgeführt.
Thema |
Beschreibung |
---|---|
Führt wesentliche Abfragebegriffe ein, und stellt Beispiele für die C#-Abfragesyntax bereit. |
|
Stellt Beispiele für mehrere grundlegende Typen von Abfrageausdrücken bereit. |
|
Gewusst wie: Behandeln von Ausnahmen in Abfrageausdrücken (C#-Programmierhandbuch) |
Gibt an, wie und wann Code, der potenziell zu Ausnahmen führen kann, aus einem Abfrageausdruck heraus verschoben werden sollte. |
Gewusst wie: Füllen von Objektauflistungen aus mehreren Quellen (LINQ) |
Gibt an, wie die select-Anweisung zum Zusammenführen von Daten aus unterschiedlichen Quellen zu einem neuen Typ verwendet wird. |
Gewusst wie: Gruppieren von Abfrageergebnissen (C#-Programmierhandbuch) |
Zeigt andere Möglichkeiten auf, die group-Klausel zu verwenden. |
Gewusst wie: Erstellen einer geschachtelten Gruppe (C#-Programmierhandbuch) |
Zeigt, wie geschachtelte Gruppen erstellt werden. |
Gewusst wie: Ausführen einer Unterabfrage für eine Gruppierungsoperation (C#-Programmierhandbuch) |
Zeigt, wie ein Unterausdruck in einer Abfrage als Datenquelle für eine neue Abfrage verwendet wird. |
Gewusst wie: Gruppieren von Ergebnissen nach zusammenhängenden Schlüsseln (C#-Programmierhandbuch) |
Veranschaulicht die Implementierung eines threadsicheren Standardabfrageoperators, der Gruppierungsvorgänge für Quellen von Streamingdaten ausführen kann. |
Gewusst wie: Dynamisches Festlegen von Prädikatfiltern zur Laufzeit (C#-Programmierhandbuch) |
Zeigt, wie eine beliebige Anzahl von Werten bereitgestellt wird, um sie in Vergleichen auf Gleichheit in einer where-Klausel zu verwenden. |
Gewusst wie: Speichern der Ergebnisse einer Abfrage im Speicher (C#-Programmierhandbuch) |
Illustriert, wie Abfrageergebnisse materialisiert und gespeichert werden, ohne unbedingt eine foreach-Schleife zu verwenden. |
Gewusst wie: Zurückgeben einer Abfrage aus einer Methode (C#-Programmierhandbuch) |
Zeigt, wie Abfragevariablen aus Methoden zurückgegeben und als Eingabeparameter an Methoden übergeben werden. |
Gewusst wie: Ausführen von benutzerdefinierten Verknüpfungsoperationen (C#-Programmierhandbuch) |
Zeigt, wie Joinoperationen auf Grundlage einer Prädikatfunktion ausgeführt werden. |
Gewusst wie: Verknüpfen mithilfe eines zusammengesetzten Schlüssels (C#-Programmierhandbuch) |
Zeigt, wie zwei Quellen auf Grundlage von mehr als einem übereinstimmenden Schlüssel verknüpft werden. |
Gewusst wie: Sortieren der Ergebnisse einer Join-Klausel (C#-Programmierhandbuch) |
Zeigt, wie eine Sequenz, die von einer Joinoperation erzeugt wird, sortiert wird. |
Gewusst wie: Ausführen innerer Verknüpfungen (C#-Programmierhandbuch) |
Zeigt, wie ein innerer Join in LINQ ausgeführt wird. |
Gewusst wie: Ausführen von Gruppenverknüpfungen (C#-Programmierhandbuch) |
Zeigt, wie ein Group Join in LINQ erzeugt wird. |
Gewusst wie: Ausführen linker äußerer Verknüpfungen (C#-Programmierhandbuch) |
Zeigt, wie ein linker äußerer Join in LINQ erzeugt wird. |
Gewusst wie: Behandeln von NULL-Werten in Abfrageausdrücken (C#-Programmierhandbuch) |
Zeigt, wie NULL-Werte in LINQ-Abfragen behandelt werden. |
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Schreiben von Abfragen in C# (LINQ)
Konzepte
Grundlegende LINQ-Abfragevorgänge (C#)
Abfragesyntax und Methodensyntax in LINQ (C#)
Übersicht über Standardabfrageoperatoren
Weitere Ressourcen
LINQ (Language-Integrated Query, sprachintegrierte Abfrage)
Abfrageschlüsselwörter (C#-Referenz)
Funktionsweise von Linq to Objects-Abfragen