LINQ-Abfrageausdrücke (C#-Programmierhandbuch)

 

Die neueste Dokumentation zu Visual Studio 2017 RC finden Sie unter Visual Studio 2017 RC Documentation (Dokumentation zu Visual Studio 2017 RC).

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 Getting Started with LINQ in C#.

  • 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 Getting Started with 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 Type Relationships in LINQ Query Operations.

  • Die Abfrage wird so lange nicht ausgeführt, bis Sie die Abfragevariable in einer foreach-Anweisung durchlaufen. Weitere Informationen hierzu finden Sie unter Introduction to LINQ Queries (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 Standard Query Operators Overview.

  • 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<TSource> 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 Query Syntax and Method Syntax in 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.

ThemaBeschreibung
Grundlagen zu AbfrageausdrückenFü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ückenGibt an, wie und wann Code, der potenziell zu Ausnahmen führen kann, aus einem Abfrageausdruck heraus verschoben werden sollte.
How to: Populate Object Collections from Multiple Sources (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 AbfrageergebnissenZeigt andere Möglichkeiten auf, die group-Klausel zu verwenden.
Gewusst wie: Erstellen einer geschachtelten GruppeZeigt, wie geschachtelte Gruppen erstellt werden.
Gewusst wie: Ausführen einer Unterabfrage für eine GruppierungsoperationZeigt, wie ein Unterausdruck in einer Abfrage als Datenquelle für eine neue Abfrage verwendet wird.
Gewusst wie: Gruppieren von Ergebnissen nach zusammenhängenden SchlüsselnVeranschaulicht die Implementierung eines threadsicheren Standardabfrageoperators, der Gruppierungsvorgänge für Quellen von Streamingdaten ausführen kann.
Gewusst wie: Dynamisches Festlegen von Prädikatfiltern zur LaufzeitZeigt, 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 SpeicherIllustriert, wie Abfrageergebnisse materialisiert und gespeichert werden, ohne unbedingt eine foreach-Schleife zu verwenden.
Gewusst wie: Zurückgeben einer Abfrage aus einer MethodeZeigt, wie Abfragevariablen aus Methoden zurückgegeben und als Eingabeparameter an Methoden übergeben werden.
Gewusst wie: Ausführen von benutzerdefinierten VerknüpfungsoperationenZeigt, wie Joinoperationen auf Grundlage einer Prädikatfunktion ausgeführt werden.
Gewusst wie: Verknüpfen mithilfe eines zusammengesetzten SchlüsselsZeigt, wie zwei Quellen auf Grundlage von mehr als einem übereinstimmenden Schlüssel verknüpft werden.
Gewusst wie: Sortieren der Ergebnisse einer Join-KlauselZeigt, wie eine Sequenz, die von einer Joinoperation erzeugt wird, sortiert wird.
Gewusst wie: Ausführen innerer VerknüpfungenZeigt, wie ein innerer Join in LINQ ausgeführt wird.
Gewusst wie: Ausführen von GruppenverknüpfungenZeigt, wie ein Group Join in LINQ erzeugt wird.
Gewusst wie: Ausführen linker äußerer VerknüpfungenZeigt, wie ein linker äußerer Join in LINQ erzeugt wird.
Gewusst wie: Behandeln von NULL-Werten in AbfrageausdrückenZeigt, wie NULL-Werte in LINQ-Abfragen behandelt werden.

C#-Programmierhandbuch
LINQ (Language-Integrated Query)
Walkthrough: Writing Queries in C#
Basic LINQ Query Operations
Query Syntax and Method Syntax in LINQ
Standard Query Operators Overview
Abfrageschlüsselwörter (LINQ)
Funktionsweise von Linq to Objects-Abfragen
Lesen und Schreiben von Abfragen
Was ist eine Auflistung?
Link für alle Elemente: Eine Liste mit LINQ-Anbietern

Anzeigen: