Ü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.
Siehe auch
Referenz
Erweiterungsmethoden (C#-Programmierhandbuch)
Konzepte
Einführung in LINQ-Abfragen (C#)
Abfrageausdruckssyntax für Standardabfrageoperatoren
Klassifizierung von Standardabfrageoperatoren nach Ausführungsarten