2011-06-07 20 views
21

¿Es IEnumerable<T>? Hasta donde yo sé, la referencia siempre apunta a una instancia de clase. ¿A qué tipo de instancia apunta realmente la consulta LINQ?¿Cuál es el tipo de devolución de una consulta LINQ?

+1

¿Por qué cerrar la pregunta? Enseña buenas prácticas de programación (mostrando lo que no debe depender de: implementación) – helios

+3

Depende de qué es la consulta LINQ. –

+0

Diría que necesitamos la motivación detrás de esta pregunta para poder responderla adecuadamente. – AakashM

Respuesta

3

No lo sé, pero supongo que es un tipo interno. No tienes que pensar en la clase.

De hecho, podrían ser diferentes clases dependiendo de la consulta concreta. El compilador podría convertir la expresión LINQ a una u otra implementación dependiendo de las condiciones/procesamiento.

0

si no me equivoco, IEnumerable<T>, donde T depende de su consulta

+2

Supongo que quiere saber la clase concreta, no la interfaz. Por supuesto, es irrelevante (y puede ser diferente para cada consulta concreta) – helios

10

Dependiendo de la fuente de datos original, o bien es IEnumerable o IQueryable:

El resultado de una consulta de base de datos LINQ es típicamente IQueryable<T> que se deriva de IEnumerable < T>, IQueryable e IEnumerable.

Si la consulta de base de datos incluye una cláusula OrdenarPor, el tipo es IOrderedQueryable<T>, que se deriva de IQueryable < T>

Si el origen de datos es un IEnumerable, el tipo de resultado es IEnumerable<T>

+0

Creo que quiere decir * clases * reales, no la interfaz. –

+0

¿Alguna razón para votar por todas las demás respuestas? – devio

+0

Me preguntaba lo mismo. Supongo que puede haber una sola respuesta correcta (en su mente) para una pregunta que en realidad puede tener múltiples respuestas dependiendo de cómo la interpretes. Por cierto, ¡me gusta tu respuesta hasta ahora! Veamos lo que el OP tenía en mente. – Maverik

14

puede encontrar out llamando al .GetType() en su variable IEnumerable<T> e inspeccionando el tipo en el depurador.

Para diferentes proveedores de LINQ e incluso diferentes métodos LINQ, dichos tipos pueden o no ser diferentes.

Lo que importa a su código es que todos ellos implementan IEnumerable<T> que se debe trabajar, o IQueryable<T> que también acepta expresiones, es decir, sus predicados y proyecciones se convertirán en árboles de sintaxis y pueden ser manipulados por un proveedor de LINQ en tiempo de ejecución, p.ej para ser traducido a SQL.

Las clases reales, si esto es lo que preguntas, incluso pueden ser generadas por el compilador, p. yield return expresión se traduce a dicha clase.
De cualquier manera, suelen ser internos y nunca, alguna vez dependen de ellos.

0

Puede consultar here para Tres partes de la operación de consulta. Puede ver que el tipo de devolución de una consulta LINQ es IEnumerable < int>.

Cuestiones relacionadas