Übersicht über Standardabfrageoperatoren

Bei den Standardabfrageoperatoren handelt es sich um die Methoden, die das Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)-Muster bilden. Diese Methoden verwenden meist Sequenzen. Eine Sequenz ist ein Objekt, dessen Typ die IEnumerable<T>-Schnittstelle oder die IQueryable<T>-Schnittstelle implementiert. Die Standardabfrageoperatoren stellen Abfragefunktionen bereit wie Filterung, Projektion, Aggregation, Sortierung und mehr.

Es gibt zwei Gruppen von LINQ-Standardabfrageoperatoren: eine für Objekte mit dem Typ IEnumerable<T> und eine andere für Objekte mit dem Typ IQueryable<T>. Die Methoden, die die einzelnen Gruppen ausmachen, sind statische Member der Enumerable-Klasse bzw. der Queryable-Klasse. Sie werden als Erweiterungsmethoden des Typs definiert, für den sie ausgeführt werden. Dies bedeutet, dass sie entweder unter Verwendung einer Syntax für statische Methoden oder einer Syntax für Instanzenmethoden aufgerufen werden können.

Verschiedene Standardabfrageoperator-Methoden werden darüber hinaus für andere Typen als die auf IEnumerable<T> oder IQueryable<T> basierenden Typen verwendet. Der Enumerable-Typ definiert zwei dieser Methoden, die beide auf Objekte des Typs IEnumerable angewendet werden. Mit diesen Methoden (Cast<TResult>(IEnumerable) und OfType<TResult>(IEnumerable)) können Sie im LINQ-Muster die Abfrage einer nicht parametrisierten oder nicht generischen Auflistung ermöglichen. Zu diesem Zweck wird von den Methoden eine stark typisierte Objektauflistung erstellt. In der Queryable-Klasse sind zwei ähnliche Methoden (Cast<TResult>(IQueryable) und OfType<TResult>(IQueryable)) definiert, die auf Objekte des Typs Queryable angewendet werden.

Die Standardabfrageoperatoren unterscheiden sich im Hinblick auf den Ausführungszeitpunkt danach, ob sie einen Singletonwert oder eine Wertesequenz zurückgeben. Methoden, die einen Singletonwert zurückgeben (z. B. Average und Sum) werden sofort ausgeführt. Methoden, die eine Sequenz zurückgeben, verzögern die Abfrageausführung und geben ein aufzählbares Objekt zurück.

Bei Methoden, die für Auflistungen im Arbeitsspeicher ausgeführt werden, also Methoden, die IEnumerable<T> erweitern, erfasst das zurückgegebene aufzählbare Objekt die an die Methode übergebenen Argumente. Wenn dieses Objekt aufgezählt wird, wird die Logik des Abfrageoperators angewendet, und die Abfrageergebnisse werden zurückgegeben.

Methoden, die IQueryable<T> erweitern, implementieren im Gegensatz dazu kein Abfrageverhalten, erstellen jedoch eine Ausdrucksbaumstruktur, die die auszuführende Abfrage darstellt. Die Abfragebearbeitung wird vom IQueryable<T>-Quellobjekt behandelt.

Aufrufe der Abfragemethoden können in einer Abfrage verkettet werden, wodurch Abfragen beliebig komplex werden können.

Im folgenden Codebeispiel wird veranschaulicht, wie die Standardabfrageoperatoren verwendet werden können, um Informationen zu einer Sequenz abzurufen.

        Dim sentence = "the quick brown fox jumps over the lazy dog"
        ' Split the string into individual words to create a collection.
        Dim words = sentence.Split(" "c)

        Dim query = From word In words 
                    Group word.ToUpper() By word.Length Into gr = Group 
                    Order By Length _
                    Select Length, GroupedWords = gr

        Dim output As New System.Text.StringBuilder
        For Each obj In query
            output.AppendLine(String.Format("Words of length {0}:", obj.Length))
            For Each word As String In obj.GroupedWords
                output.AppendLine(word)
            Next
        Next

        'Display the output
        MsgBox(output.ToString())

        ' This code example produces the following output:
        '
        ' Words of length 3:
        ' THE
        ' FOX
        ' THE
        ' DOG
        ' Words of length 4:
        ' OVER
        ' LAZY
        ' Words of length 5:
        ' QUICK
        ' BROWN
        ' JUMPS 

           string sentence = "the quick brown fox jumps over the lazy dog";
           // Split the string into individual words to create a collection.
           string[] words = sentence.Split(' ');

           // Using query expression syntax.
           var query = from word in words
                       group word.ToUpper() by word.Length into gr
                       orderby gr.Key
                       select new { Length = gr.Key, Words = gr };

           // Using method-based query syntax.
           var query2 = words.
               GroupBy(w => w.Length, w => w.ToUpper()).
               Select(g => new { Length = g.Key, Words = g }).
               OrderBy(o => o.Length);

           foreach (var obj in query)
           {
               Console.WriteLine("Words of length {0}:", obj.Length);
               foreach (string word in obj.Words)
                   Console.WriteLine(word);
           }

           // This code example produces the following output:
           //
           // Words of length 3:
           // THE
           // FOX
           // THE
           // DOG
           // Words of length 4:
           // OVER
           // LAZY
           // Words of length 5:
           // QUICK
           // BROWN
           // JUMPS 

Abfrageausdruckssyntax

Einige der häufiger verwendeten Standardabfrageoperatoren verfügen über eine dedizierte Syntax für C#- und Visual Basic-Schlüsselwörter, durch die sie als Teil eines Abfrageausdrucks aufgerufen werden können. Weitere Informationen über Standardabfrageoperatoren, die über dedizierte Schlüsselwörter verfügen, sowie über deren entsprechende Syntax finden Sie unter Abfrageausdruckssyntax für Standardabfrageoperatoren.

Erweitern der Standardabfrageoperatoren

Sie können die Gruppe von Standardabfrageoperatoren vergrößern, indem Sie domänenspezifische Methoden erstellen, die für Ihre Zieldomäne oder -technologie geeignet sind. Außerdem können Sie die Standardabfrageoperatoren durch eigene Implementierungen ersetzen, die zusätzliche Dienste wie Remoteauswertung, Abfrageübersetzung und Optimierung bieten. Ein Beispiel finden Sie unter AsEnumerable<TSource>.

Verwandte Abschnitte

Über die folgenden Links gelangen Sie zu Themen, die zusätzliche Informationen zu den verschiedenen Standardabfrageoperatoren bieten und nach Funktionen unterteilt sind.

Sortieren von Daten

Mengenvorgänge

Filtern von Daten

Quantifiziereroperationen

Projektionsvorgänge

Partitionieren von Daten

Verknüpfungsvorgänge

Gruppieren von Daten

Generierungsvorgänge

Gleichheitsoperationen

Elementvorgänge

Konvertieren von Datentypen

Verkettungsvorgänge

Aggregationsoperationen

Siehe auch

Referenz

Enumerable

Queryable

Erweiterungsmethoden (C#-Programmierhandbuch)

Konzepte

Einführung in LINQ-Abfragen (C#)

Abfrageausdruckssyntax für Standardabfrageoperatoren

Klassifizierung von Standardabfrageoperatoren nach Ausführungsarten

Erweiterungsmethoden (Visual Basic)