Es difícil responder a la pregunta porque LINQ es tantas cosas diferentes. Por ejemplo, apegándose a C#, las siguientes cosas están involucradas:
- Las expresiones de consulta son "pre-procesadas" en "C# sin expresiones de consulta" que luego se compila normalmente. La parte de expresión de la consulta de la especificación es realmente corta, básicamente es una traducción mecánica que no asume nada sobre el significado real de la consulta, más allá de que "order by se traduce en OrderBy/ThenBy/etc".
- Los delegados se utilizan para representar acciones arbitrarias con una firma particular, como código ejecutable.
- Los árboles de expresiones se utilizan para representar lo mismo, pero como datos (que se pueden examinar y traducir en una forma diferente, por ejemplo SQL)
- Las expresiones Lambda se utilizan para convertir el código fuente en delegados o árboles de expresiones.
- La mayoría de los proveedores de LINQ utilizan métodos de extensión para encadenar llamadas de métodos estáticos. Esto permite que una interfaz simple (por ejemplo,
IEnumerable<T>
) gane efectivamente mucha más potencia.
- Los tipos anónimos se utilizan para las proyecciones: cuando tiene una colección de datos dispareja y quiere bits de cada aspecto de esos datos, un tipo anónimo le permite agruparlos.
- Las variables locales implícitamente tipadas (
var
) se usan principalmente cuando se trabaja con tipos anónimos, para mantener un lenguaje estáticamente tipado donde no se puede "hablar" explícitamente el nombre del tipo.
- Los bloques iteradores se usan generalmente para implementar consultas en proceso, p. para LINQ to Objects.
- La inferencia de tipo se utiliza para hacer que todo sea mucho más sencillo: hay muchos métodos genéricos en LINQ, y sin inferencia de tipo sería realmente doloroso.
- generación de código se utiliza para activar un modelo (por ejemplo DBML) en código
- tipos parciales se utilizan para proporcionar extensibilidad a código generado
- atributos se utilizan para proporcionar metadatos a los proveedores de LINQ
Obviamente una muchos de estos no son solo utilizados por LINQ, pero las diferentes tecnologías LINQ dependerán de ellos.
Si puede dar más indicaciones sobre los aspectos que le interesan, podremos proporcionarle más detalles.
Si está interesado en implementar efectivamente LINQ to Objects, le podría interesar una charla que di en DDD en Reading hace un par de semanas, básicamente implementando la mayor cantidad posible de LINQ to Objects en una hora. No estábamos completos al final, pero debería dar una buena idea del tipo tipo de lo que necesita hacer (y almacenamiento en búfer/transmisión en tiempo real, bloques de iteradores, traducción de expresiones de consulta, etc.). Los videos aún no han terminado (y aún no he puesto el código para su descarga) pero si está interesado, envíeme un correo electrónico a [email protected] y le avisaré cuando estén disponibles. . (Probablemente también lo publicaré en el blog.)
¿Quiere decir cómo se traduce la consulta en la sintaxis/árboles subyacente o cómo funciona LINQ en el sentido de ejecución? – JaredPar
En lo que más me preocupan es en los sistemas de tiempo de compilación –