Übersicht über Standardabfrageoperatoren (C#)

Die Standardabfrageoperatoren sind die Methoden, die das LINQ-Muster bilden. Die meisten dieser Methoden funktionieren mit Sequenzen. Eine Sequenz ist ein Objekt, dessen Typ die Schnittstellen IEnumerable<T> oder IQueryable<T> implementiert. Die Standardabfrageoperatoren stellen Abfragefunktionen wie Filterung, Projektion, Aggregation, Sortierung und weitere bereit.

Es gibt zwei Gruppen von LINQ-Standardabfrageoperatoren; eine Gruppe funktioniert auf Grundlage von Objekten vom Typ IEnumerable<T>, die andere auf Grundlage von Objekten vom Typ IQueryable<T>. Die Methoden, die eine Gruppe bilden, sind statische Member der Klassen Enumerable und Queryable. Sie werden als Erweiterungsmethoden des Typs, auf dessen Grundlage sie funktionieren, definiert. Das bedeutet, dass Sie entweder mit der Syntax für statische Methoden oder für Instanzmethoden aufgerufen werden.

Darüber hinaus funktionieren mehrere Standardabfrageoperator-Methoden auf Grundlage anderer Typen als die, die auf IEnumerable<T> oder IQueryable<T> basieren. Der Typ Enumerable definiert zwei Methoden, die beide auf Grundlage von Objekten vom Typ IEnumerable funktionieren. Die Methoden Cast<TResult>(IEnumerable) und OfType<TResult>(IEnumerable) ermöglichen es Ihnen, eine nicht parametrisierte oder nicht generische Auflistung im LINQ-Muster abfragen zu lassen. Dies erfolgt durch Erstellen einer stark typisierten Auflistung von Objekten. Die Klasse Queryable definiert zwei ähnliche Methoden, Cast<TResult>(IQueryable) und OfType<TResult>(IQueryable), die auf Grundlage von Objekten vom Typ Queryable funktionieren.

Die Standardabfrageoperatoren unterscheiden sich im Zeitpunkt ihrer Ausführung. Dies hängt davon ab, ob sie einen Singleton-Wert oder eine Sequenz von Werten zurückgeben. Die Methoden, die einen Singleton-Wert 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 auflistbares Objekt zurück.

Bei Methoden, die auf Grundlage von im Speicher enthaltenen Auflistungen funktionieren, d.h. die Methoden, die IEnumerable<T> erweitern, erfasst das zurückgegebene auflistbare Objekt die Argumente, die an die Methode übergeben wurden. Wenn dieses Objekt auflistbar ist, tritt die Logik des Abfrageoperators in Kraft, und die Abfrageergebnisse werden zurückgegeben.

Im Gegensatz dazu implementieren Methoden, die IQueryable<T> erweitern, kein Abfrageverhalten. Sie erstellen stattdessen eine Ausdrucksbaumstruktur, die die auszuführende Abfrage darstellt. Die Verarbeitung von Abfragen wird vom Quellobjekt IQueryable<T> übernommen.

Aufrufe der Abfragemethode können miteinander in eine Abfrage verkettet werden. Dadurch können Abfragen von beliebiger Komplexität sein.

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

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 Schlüsselwortsyntax von C# und Visual Basic-Sprache, wodurch sie als Teil eines query-Ausdrucks aufgerufen werden können. Weitere Informationen über Standardabfrageoperatoren, die über dedizierte Schlüsselwörter und deren entsprechende Syntax verfügen, finden Sie unter Query Expression Syntax for Standard Query Operators (C#) (Abfrageausdruckssyntax für Standardabfrageoperatoren (C#)).

Erweitern der Standardabfrageoperatoren

Sie können die Gruppe von Standardabfrageoperatoren durch Erstellen von domänenspezifischen Methoden erweitern, die für Ihre Zieldomäne oder -technologie geeignet sind. Sie können die Standardabfrageoperatoren auch mit ihren eigenen Implementierungen ersetzen, die zusätzliche Dienste bieten, z.B. Remote-Auswertung, Abfrageübersetzung und Optimierung. Unter AsEnumerable finden Sie ein Beispiel.

Über die folgenden Links gelangen Sie zu Themen, die Ihnen weitere Informationen über die verschiedenen Standardabfrageoperatoren basierend auf deren Funktionen bieten.

Sorting Data (C#) (Sortieren von Daten (C#))

Set Operations (C#) (Set-Vorgänge (C#))

Filtering Data (C#) (Filtern von Daten (C#))

Quantifier Operations (C#) (Quantifizierer-Vorgänge (C#))

Projection Operations (C#) (Projektionsvorgänge (C#))

Partitioning Data (C#) (Partitionieren von Daten (C#))

Join Operations (C#) (Verknüpfungsvorgänge (C#))

Grouping Data (C#) (Gruppieren von Daten (C#))

Generation Operations (C#) (Generierungsvorgänge (C#))

quality Operations (C#) (Gleichheitsvorgänge (C#))

Element Operations (C#) (Elementvorgänge (C#))

Converting Data Types (C#) (Konvertieren von Datentypen (C#))

Concatenation Operations (C#) (Verkettungsvorgänge (C#))

Aggregation Operations (C#) (Aggregationsvorgänge (C#))

Siehe auch

Enumerable
Queryable
Introduction to LINQ Queries (C#) (Einführung in LINQ-Abfragen (C#))
Query Expression Syntax for Standard Query Operators (C#) (Abfrageausdruckssyntax für Standardabfrageoperatoren (C#))
Classification of Standard Query Operators by Manner of Execution (C#) (Klassifizierung von Standardabfrageoperatoren nach Ausführungsarten (C#))
Erweiterungsmethoden