Compartir a través de


Clasificación de operadores de consulta estándar por modo de ejecución

Actualización: noviembre 2007

LINQ to Objects implementa los métodos de operadores de consulta estándar mediante dos formas posibles de ejecución: inmediata o aplazada. Los operadores de consulta que utilizan la ejecución aplazada pueden dividirse a su vez en dos categorías: con o sin transmisión por secuencias. Saber cómo se ejecutan los distintos operadores de consulta puede resultar útil para entender los resultados obtenidos a partir de una consulta determinada. Esto se cumple especialmente si el origen de datos cambia o si genera una consulta sobre otra. En este tema se clasifican los operadores de consulta estándar según su modo de ejecución.

Modos de ejecución

Inmediata

Ejecución inmediata significa que el origen de datos se lee y la operación se realiza en el punto del código donde se declara la consulta. Todos los operadores de consulta estándar que devuelven un resultado único no enumerable se ejecutan de forma inmediata.

Aplazada

Ejecución aplazada significa que la operación no se realiza en el punto del código donde se declara la consulta. La operación se realiza solamente cuando se enumera la variable de consulta, por ejemplo, cuando se utiliza una instrucción foreach (For Each en Visual Basic). Esto significa que los resultados de la ejecución de la consulta dependen del contenido del origen de datos cuando se ejecuta la consulta, no cuando ésta se define. Si la variable de consulta se enumera varias veces, pueden obtenerse resultados distintos en cada ocasión. Casi todos los operadores de consulta estándar cuyo tipo de valor devuelto es IEnumerable<T> o IOrderedEnumerable<TElement> se ejecutan de forma aplazada.

Los operadores de consulta que utilizan la ejecución aplazada pueden clasificarse a su vez en operadores con o sin transmisión por secuencias.

Con transmisión por secuencias

Los operadores con transmisión por secuencias no tienen que leer todos los datos de origen para proporcionar los elementos de resultado. En el momento de la ejecución, un operador de este tipo actúa en cada elemento de origen cuando se lee y proporciona el elemento si es pertinente. Un operador con transmisión por secuencias continúa leyendo elementos de origen hasta que puede generarse un elemento de resultado. Esto significa que puede leerse más de un elemento de origen para generar un elemento de resultado.

Sin transmisión por secuencias

Los operadores sin transmisión por secuencias deben leer todos los datos de origen para poder proporcionar un elemento de resultado. Operaciones como la ordenación o la agrupación pertenecen a esta categoría. En el momento de la ejecución, los operadores de consulta sin transmisión por secuencias leen todos los datos de origen, los colocan en una estructura de datos, realizan la operación y proporcionan los elementos resultantes.

Tabla de clasificación

En la tabla siguiente se clasifica cada método de operador de consulta estándar según su método de ejecución.

Nota:

Si un operador aparece en dos columnas, dos secuencias de entrada intervienen en la operación y cada una de ellas se evalúa de forma distinta. En estos casos, la primera secuencia de la lista de parámetros siempre se evalúa de forma aplazada con transmisión por secuencias.

Operador de consulta estándar

Tipo de valor devuelto

Ejecución inmediata

Ejecución aplazada con transmisión por secuencias

Ejecución aplazada sin transmisión por secuencias

Aggregate

TSource

X

 

 

All<TSource>

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<TSource>

IEnumerable<T>

X

 

Average

Valor numérico único

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

Valor numérico único, TSource o TResult

X

 

 

Min

Valor numérico único, TSource o 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

Valor numérico único

X

 

 

Take<TSource>

IEnumerable<T>

 

X

 

TakeWhile

IEnumerable<T>

 

X

 

ThenBy

IOrderedEnumerable<TElement>

 

 

X

ThenByDescending

IOrderedEnumerable<TElement>

 

 

X

ToArray<TSource>

Matriz de TSource

X

 

 

ToDictionary

Dictionary<TKey, TValue>

X

 

 

ToList<TSource>

IList<T>

X

 

 

ToLookup

ILookup<TKey, TElement>

X

 

 

Union

IEnumerable<T>

 

X

 

Where

IEnumerable<T>

 

X

 

Vea también

Conceptos

Información general sobre operadores de consulta estándar

Sintaxis de las expresiones de consulta para operadores de consulta estándar

LINQ to Objects

Referencia

Enumerable