Klassifizierung von Standardabfrageoperatoren nach Ausführungsarten

Es gibt zwei Hauptausführungsarten von Implementierungen der Standardabfrageoperatormethoden von LINQ-zu-Objekten: die unmittelbare und die verzögerte Ausführung. Abfrageoperatoren mit verzögerter Ausführung können darüber hinaus in zwei Kategorien unterteilt werden: Streaming und Nicht-Streaming-Operatoren. Wenn Sie wissen, wie die einzelnen Operatoren ausgeführt werden, verstehen Sie das Ergebnis einer bestimmten Abfrage möglicherweise besser. Das gilt besonders dann, wenn die Datenquelle wechselt oder eine Abfrage auf Grundlage einer anderen Abfrage erstellt wird. In diesem Thema werden die Standardabfrageoperatoren nach ihrer Ausführungsart klassifiziert.

Ausführungsarten

Unmittelbar

Unmittelbare Ausführung bedeutet, dass an der Stelle im Code, an der die Abfrage deklariert ist, die Datenquelle gelesen und die Operation ausgeführt wird. Alle Standardabfrageoperatoren, die ein einzelnes, nicht aufzählbares Ergebnis zurückgeben, werden unmittelbar ausgeführt.

Verzögert

Verzögerte Ausführung bedeutet, dass die Operation nicht an der Stelle im Code ausgeführt wird, an der die Abfrage deklariert ist. Die Operation wird nur ausgeführt, wenn die Abfragevariable aufgezählt wird, z. B. mithilfe einer foreach-Anweisung (For Each in Visual Basic). Das bedeutet, dass die Ergebnisse der Ausführung einer Abfrage mehr vom Inhalt der Datenquelle zum Zeitpunkt der Ausführung der Abfrage abhängig sind, als zum Zeitpunkt der Definition. Wenn die Abfragevariable mehrmals aufgelistet wird, kann das Ergebnis jedes Mal anders ausfallen Standardabfrageoperatoren mit dem Rückgabetyp IEnumerable<T> oder IOrderedEnumerable<TElement> werden nahezu in allen Fällen verzögert ausgeführt.

Verzögert ausgeführte Abfrageoperatoren können zusätzlich als Streaming- bzw. Nicht-Streaming-Operatoren klassifiziert werden.

Streaming

Streaming-Operatoren müssen vor dem Bereitstellen von Elementen nicht die gesamten Quelldaten lesen. Zum Zeitpunkt der Ausführung wird die Operation eines Streaming-Operators für jedes gelesene Quellelement ausgeführt, und das Element wird ggf. bereitgestellt. Die Quellelemente werden von Streaming-Operatoren so lange gelesen, bis ein Ergebniselement erzeugt werden kann. Das bedeutet, dass möglicherweise mehrere Quellelemente gelesen werden müssen, um ein Ergebniselement zu erzeugen.

Nicht-Streaming

Nicht-Streaming-Operatoren müssen vor dem Bereitstellen eines Ergebniselements die gesamten Quelldaten lesen. Zu dieser Kategorie zählen Vorgänge wie beispielsweise das Sortieren oder Gruppieren. Bei der Ausführung werden von Nicht-Streaming-Operatoren zunächst die gesamten Quelldaten gelesen und in eine Datenstruktur übertragen. Anschließend wird der Vorgang ausgeführt, und das Ergebnis wird bereitgestellt.

Klassifizierungstabelle

In der folgenden Tabelle werden alle Standardabfrageoperatormethoden nach Ausführungsmethoden klassifiziert.

Tipp

Wenn ein Operator in zwei Spalten gekennzeichnet ist, gehören zwei Eingabesequenzen zu der Operation, und beide Sequenzen werden unterschiedlich ausgewertet. In diesen Fällen wird immer die erste Sequenz in der Parameterliste verzögert und mit Streaming ausgewertet.

Standardabfrageoperator

Rückgabetyp

Unmittelbare Ausführung

Verzögerte Streaming-Ausführung

Verzögerte Nicht-Streaming-Ausführung

Aggregate

TSource

X

 

 

All<TSource>

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<TSource>

IEnumerable<T>

 

X

 

Average

Einzelner numerischer Wert

X

 

 

Cast<TResult>

IEnumerable<T>

 

X

 

Concat<TSource>

IEnumerable<T>

 

X

 

Contains

Boolean

X

 

 

Count

Int32

X

 

 

DefaultIfEmpty

IEnumerable<T>

 

X

 

Distinct

IEnumerable<T>

 

X

 

ElementAt<TSource>

TSource

X

 

 

ElementAtOrDefault<TSource>

TSource

X

 

 

Empty<TResult>

IEnumerable<T>

X

 

 

Except

IEnumerable<T>

 

X

 X

First

TSource

X

 

 

FirstOrDefault

TSource

X

 

 

GroupBy

IEnumerable<T>

 

 

X

GroupJoin

IEnumerable<T>

 

X

Intersect

IEnumerable<T>

 

X

X

Join

IEnumerable<T>

 

X

X

Last

TSource

X

 

 

LastOrDefault

TSource

X

 

 

LongCount

Int64

X

 

 

Max

Einzelner numerischer Wert, TSource oder TResult

X

 

 

Min

Einzelner numerischer Wert, TSource oder TResult

X

 

 

OfType<TResult>

IEnumerable<T>

 

X

 

OrderBy

IOrderedEnumerable<TElement>

 

 

X

OrderByDescending

IOrderedEnumerable<TElement>

 

 

X

Range

IEnumerable<T>

 

X

 

Repeat<TResult>

IEnumerable<T>

 

X

 

Reverse<TSource>

IEnumerable<T>

 

 

X

Select

IEnumerable<T>

 

X

 

SelectMany

IEnumerable<T>

 

X

 

SequenceEqual

Boolean

X

 

 

Single

TSource

X

 

 

SingleOrDefault

TSource

X

 

 

Skip<TSource>

IEnumerable<T>

 

X

 

SkipWhile

IEnumerable<T>

 

X

 

Sum

Einzelner numerischer Wert

X

 

 

Take<TSource>

IEnumerable<T>

 

X

 

TakeWhile

IEnumerable<T>

 

X

 

ThenBy

IOrderedEnumerable<TElement>

 

 

X

ThenByDescending

IOrderedEnumerable<TElement>

 

 

X

ToArray<TSource>

TSource-Array

X

 

 

ToDictionary

Dictionary<TKey, TValue>

X

 

 

ToList<TSource>

IList<T>

X

 

 

ToLookup

ILookup<TKey, TElement>

X

 

 

Union

IEnumerable<T>

 

X

 

Where

IEnumerable<T>

 

X

 

Siehe auch

Referenz

Enumerable

Konzepte

Übersicht über Standardabfrageoperatoren

Abfrageausdruckssyntax für Standardabfrageoperatoren

LINQ-zu-Objekte