Pregunta

¿LINQ es una nueva característica en .NET 4.0, no compatible con versiones anteriores como .NET 3.5? ¿Para qué es útil? Parece ser capaz de construir árboles de expresión. ¿Qué es un árbol de expresión, en realidad? ¿LINQ puede extraer información como clase, método y campo de un archivo C #?

¿Puede alguien proporcionarme un código de trabajo para demostrar lo que LINQ puede hacer?

¿Fue útil?

Solución

LINQ es una característica .NET 3.5 con función incorporada compatibilidad con el lenguaje de C # 3.0 y Visual Basic 2008. Hay muchos ejemplos en MSDN .

Otros consejos

Linq se agregó en .Net 3.5 (y se agregó al compilador c # 3.0, así como en forma ligeramente limitada al compilador VB.net en la misma versión)

In es una consulta integrada en el lenguaje, aunque cubre muchas adiciones complejas tanto en el idioma como en el tiempo de ejecución para lograr esto que son útiles en sí mismos.

La funcionalidad de Expresión es simplemente poner la capacidad de un programa, en tiempo de ejecución, inspeccionar la sintaxis abstracta de ciertas construcciones de código transmitidas. Estos se llaman lambdas. Y son, en esencia, una forma de escribir funciones anónimas con mayor facilidad mientras se facilita la introspección en tiempo de ejecución de su estructura.

La funcionalidad 'SQL like' con la que Linq está más estrechamente asociada (aunque de ninguna manera es la única) se llama Linq to Sql, donde por algo como esto:

from f in Foo where s.Blah == "wibble" select f.Wobble;

se compila en una representación de esta consulta, en lugar de simplemente codificar para ejecutar la consulta. La parte que lo convierte en linq a sql es el 'backend' que lo convierte en sql. Para esto, la expresión se traduce en sentencias de servidor sql para ejecutar la consulta en una base de datos vinculada con la asignación de filas a objetos .net y la conversión de la lógica c # en cláusulas where equivalentes. Podría aplicar exactamente el mismo código si Foo fuera una colección de objetos .net simples (en cuyo punto es & "; Linq a objetos &";) La conversión de la expresión sería un código .Net directo .

La lambda anterior escrita en el lenguaje integrado es en realidad el equivalente de:

Foo.Where (f = > f.Blah == " wibble) .Seleccione (f = > f.Wobble);

Donde Foo es una colección escrita. Para las bases de datos, las clases se sintetizan para representar los valores en la base de datos para permitir que esto se compile, y para permitir valores de ida y vuelta desde las áreas sql a las áreas .net y viceversa.

El aspecto crítico de la parte Language Integrated de Linq es que las construcciones de lenguaje resultantes son partes de primera clase del código resultante. En lugar de simplemente dar como resultado una función, proporcionan la forma en que se construyó la función (como una expresión) para que otros aspectos del programa puedan manipularla.

Los consumidores de esta funcionalidad pueden simplemente elegir ejecutarla (ejecutar la función con la que se compila el lambda) o pedir la expresión que la describe y luego hacer algo diferente con ella.

Muchos aspectos de lo que hace esto posible se colocan debajo de " Linq " banner a pesar de no ser realmente Linq themsleves.
Por ejemplo, los tipos anónimos son necesarios para un uso fácil de projection (elegir un subconjunto de las propiedades posibles), pero los tipos anónimos también se pueden usar fuera de Linq.

Linq, especialmente a través de las lambdas (que hacen que la escritura de delegados anónimos sea muy ligera en términos de sintaxis) ha llevado a un aumento en las capacidades funcionales de c #. esto se ve reforzado por los métodos de extensión en IEnumerable<T> como Select (), correspondiente a map en muchos lenguajes de funciones y Where () correspondiente a filter. Al igual que los tipos anónimos, esto no es en sí mismo & Quot; Linq & Quot; aunque muchos lo ven como un efecto muy beneficioso en el desarrollo de c # (esta no es una visión universal, pero es ampliamente aceptada).

Las expresiones son un tema más avanzado, y entiendong de ellos es completamente innecesario para usar linq, aunque ciertos 'trucos' son posibles al usarlos. En general, le interesarían las Expresiones solo si intentara escribir proveedores de linq, que es un código para tomar una expresión en lugar de solo una función y usar eso para hacer algo diferente de lo que haría la función simple, como hablar con una fuente de datos externa .

Otros usos serían cuando desee obtener algunos metadatos sobre lo que están haciendo los elementos internos de la función, tal vez luego compilar la expresión (lo que resulta en un delegado que le permitirá ejecutar la expresión como una función) y hacer algo con él o simplemente mirando los metadatos de los objetos para hacer un código reflexivo que es tiempo de compilación verificado como esta respuesta muestra .

Un área de esta pregunta que aún no se ha cubierto son los árboles de expresión. Hay un muy buen artículo sobre árboles de expresión (y expresión lambda) disponible aquí .

La otra cosa importante a tener en cuenta sobre los árboles de expresión es que al construir un árbol de expresión para definir lo que vas a hacer , no tienes que realmente hacer nada. Me refiero a la ejecución diferida.

//this code will only build the expression tree
var itemsInStock = from item in warehouse.Items
                   where item.Quantity > 0;

// this code will cause the actual execution
Console.WriteLine("Items in stock: {0}", itemsInStock.Count());

LINQ se introdujo con .NET 3.5. Este sitio tiene muchos ejemplos.

Esto también está cubierto ampliamente aquí en SO .

System.Linq.Expressions es para construir a mano (o generar máquinas) árboles de expresión. Tengo la sensación de que, dada la complejidad de construir una funcionalidad más complicada, este espacio de nombres está infrautilizado. Sin embargo, es extremadamente poderoso. Por ejemplo, uno de mis compañeros de trabajo implementó recientemente un árbol de expresión que puede escalar automáticamente cualquier objeto LINQ to SQL utilizando una función de densidad acumulativa. Cada columna tiene su propio árbol que se compila para que sea rápido. He estado creando un compilador especializado que los usa ampliamente para implementar funcionalidades básicas, así como para pegar el resto del código generado.

Consulte esta publicación de blog para obtener más información e ideas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top