LINQ-Abfrageausdrücke (C#-Programmierhandbuch)

Aktualisiert: November 2007

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 mit einer deklarativen Abfragesyntax geschrieben, die mit C# 3.0 eingeführt wurde. Durch den Einsatz einer Abfragesyntax können Sie sogar komplexe Filter-, Sortier- und Gruppieroperationen mit nur minimalem Code für Datenquellen durchführen. 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 Abfrageoperationen (LINQ).

  • Die Abfrage wird so lange nicht ausgeführt, bis Sie die Abfragevariable in einer foreach-Anweisung durchlaufen. Weitere Informationen finden Sie unter Einführung in LINQ-Abfragen.

  • 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#-Programmiersprachenspezifikation 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 (LINQ).

  • 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.

In der folgenden Tabelle werden Themen, die weitere Informationen über Abfragen und Codebeispiele für häufige Aufgaben enthalten, aufgeführt.

Thema

Beschreibung

Grundlagen zu Abfrageausdrücken (C#-Programmierhandbuch)

Führt wesentliche Abfragebegriffe ein, und stellt Beispiele für die C#-Abfragesyntax bereit.

Gewusst wie: Schreiben von LINQ-Abfragen in C#

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 Ergebnissen auf verschiedene Weisen (C#-Programmierhandbuch)

Zeigt andere Möglichkeiten auf, die group-Klausel zu verwenden.

Gewusst wie: Gruppieren einer 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 Verknüpfungsoperationen 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 Verknüpfungsoperation erzeugt wird, sortiert wird.

Gewusst wie: Ausführen innerer Verknüpfungen (C#-Programmierhandbuch)

Zeigt, wie eine innere Verknüpfung in LINQ ausgeführt wird.

Gewusst wie: Ausführen von Gruppenverknüpfungen (C#-Programmierhandbuch)

Zeigt, wie eine Gruppenverknüpfung in LINQ erzeugt wird.

Gewusst wie: Ausführen linker äußerer Verknüpfungrn (C#-Programmierhandbuch)

Zeigt, wie eine linke äußere Verknüpfung 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 Abfrageoperationen (LINQ)

Abfragesyntax und Methodensyntax (LINQ)

Übersicht über Standardabfrageoperatoren

Referenz

Allgemeines LINQ-Programmierhandbuch

Weitere Ressourcen

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)

Abfrageschlüsselwörter (C#-Referenz)

How Linq to Objects Queries Work

Lesen und Schreiben von Abfragen

Was ist eine Auflistung?

Link für alle Elemente: Eine Liste mit LINQ-Anbietern