2010-07-27 16 views
7

Duplicar posibles:
Learning about LINQ¿Qué es LINQ exactamente?

Hola a todos,

sólo quiero entender qué es exactamente LINQ en DOTNET? ¿Y, cómo funciona?

Tx

+2

¿Has probado el primer resultado de búsqueda para 'LINQ' en Google? –

+0

Posible duplicado de http://stackoverflow.com/questions/471502/what-is-linq –

Respuesta

3

LINQ es muchas cosas, es la combinación de muchas cosas más pequeñas.

Esta respuesta va a ser un revoltijo de información, me disculpo. Tu mejor opción es esperar un poco y ver si alguien más lo resume mejor, y buscar las palabras clave que uso en google.

LINQ significa "L anguage EN tegrated Q uery", y la interpretación más ingenua es que se añaden sintaxis SQL similar al lenguaje de programación C#.

Así que en lugar de:

IEnumerable<int> values = otherValues.Where(i => i > 5); 

tienen la sintaxis:

IEnumerable<int> values = from i in otherValues 
          where i > 5 
          select i; 

El compilador de C# en realidad se traducirá el segundo trozo de código anterior a la primera pieza de código, por lo que en la realidad, solo estás llamando a métodos en las colecciones.

Sin embargo, y aquí hay otra parte del rompecabezas. Esos métodos en realidad no están definidos en las colecciones. Están definidos como métodos de extensión, lo que significa que están definidos en otro lugar, con algunos trucos que básicamente dicen "deja que el programador use estos métodos como si estuvieran definidos en el tipo de colección para empezar, y solo arregla el código durante la compilación ".

Así que la primera pieza de código anterior:

IEnumerable<int> values = otherValues.Where(i => i > 5); 

realidad termina siendo compilado como:

IEnumerable<int> values = Enumerable.Where(otherValues, i => i > 5); 

El donde se define método here: Enumerable.Where.

La siguiente pieza de magia es que el compilador de C# no usa Enumerable. En realidad, lo que hace es reescribir el código sobre la marcha para que parezca la segunda pieza de código en mi respuesta aquí, y dejar que la inferencia de tipo normal lo resuelve. En otras palabras, va a pretender que realmente escribió el segundo fragmento de código, y luego ver que "otherValues" es un List<T> donde T es un int, y luego encuentra que Enumerable.Where es el que debe llamar.

Esto significa que puede, para otros tipos de colecciones, realizar sus propias implementaciones de Where, y la sintaxis de LINQ no sería más acertada.

Esto significa ... que pueden consultarse cosas que no son realmente colecciones en memoria. Por ejemplo, si "otherValues" arriba es algo que sabe cómo obtener datos de una base de datos, se llamará a un método Where diferente, no al de Enumerable.Where.

Esto permite a esas otras implementaciones hacer sus cosas a su manera, por ejemplo, escribiendo el SQL para usted, ejecutándolo y empaquetando el resultado para que parezca el código de llamada como si realmente fuera un - colección de memorias para comenzar.

La siguiente pieza de magia son las expresiones. El parámetro al método Donde anteriormente, i => i > 5 es una expresión lambda, o un método anónimo, en la mayoría de los casos, y en realidad se podría declarar como este para una colección en memoria:

Func<int, bool> w = delegate(int i) { return i > 5; }; 
IEnumerable<int> values = otherValues.Where(w); 

Sin embargo, el apoyo expresión en C# significa que también se puede declarar como:

Expression<Func<int, bool>> w = i => i > 5; 

en este caso, el compilador no es en realidad almacenarla como una pieza compilada del código, sino más bien una estructura de datos en memoria que sabe que se necesita un argumento, lo compara con 5 con una comparación mayor que y devuelve el resultado. Tenga en cuenta que debe usar la forma lambda de escribirlo, no como un delegado.

Este conocimiento permite aquellas otras implementaciones Where, si se declaran para tomar expresiones, no solo para obtener una "cláusula where", sino para verla, seleccionarla y volver a escribirla.

Lo que significa que la generación de ese SQL se puede hacer en el método Where que sepa cómo tratar con el código SQL.

Aquí está la declaración LINQ to SQL del método Where: Queryably.Where.

Así LINQ es la combinación de muchas piezas pequeñas de la tecnología añadido a la compilador de C#:

+0

tx respuesta muy completa !! –

+0

Asegúrate de revisar el enlace de la pregunta duplicada en la parte superior de tu pregunta. –

0

Piense como consultar objetos utilizando una sintaxis SQL. Aquí es un ejemplo copiado de http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

public void Linq1() 
{ 
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

    var lowNums = 
     from n in numbers 
     where n < 5 
     select n; 

    Console.WriteLine("Numbers < 5:"); 
    foreach (var x in lowNums) 
    { 
     Console.WriteLine(x); 
    } 
} 
0

Linq es un conjunto de métodos de extensión a de IEnumerable. Tiene la intención de permitirle abstraer algunos de los detalles de sacar objetos de las colecciones. Cuando "consulta" su colección a través de Linq, lo hace de una manera que es declarativa en lugar de imperativo. Lo que eso significa es que su consulta de Linq muestra lo que quiere obtener, en lugar de cómo va a obtenerlo exactamente. En un bucle foreach(), tendrá que ser realmente explícito sobre cómo va a filtrar, agrupar y ordenar sus resultados. Con Linq, son solo unas breves declaraciones y los detalles de implementación se abstraen de usted.

Mucha gente tiene la idea errónea de que tiene que ver con SQL debido a Linq-to-Sql, pero realmente esa es solo una pequeña parte de Linq. No tiene que usar L2S para aprovechar al máximo el poder de Linq, y de hecho muchas personas no lo hacen. Aunque Linq-to-SQL en mi opinión personal es el maullido del gato si usted es una tienda .NET con solo SQL Server como su base de datos.

2

Es varias cosas diferentes.

Linq, como aparece en el espacio de nombres System.Linq es un conjunto de métodos de extensión que le permiten consultar colecciones directamente en el código. Es un acrónimo de "Language Integrated Query".

También es un conjunto de proveedores que le permiten consultar diferentes fuentes de datos: SQL con Linq a SQL, XML con Linq a XML y más.

2

MSDN hace un muy buen trabajo de introducción de LINQ:

[...]

.NET Language-Integrated Query define un conjunto de propósito general los operadores de consulta estándar que permiten el recorrido, filtro, y las operaciones de proyección a se expresarán en una forma declarada directa en cualquier lenguaje de programación basado en .NET. Los operadores de consulta estándar permiten que las consultas sean aplicadas a cualquier fuente de información basada en IEnumerable . LINQ permite que terceros terceros aumenten el conjunto de operadores de consulta estándar con los nuevos operadores de dominio específicos que son apropiados para el dominio de destino o la tecnología .Más importante aún, las terceras partes también son libres para sustituir a los operadores de consulta estándar con sus propias implementaciones que proporcionan servicios adicionales como evaluación a distancia, la traducción consulta, optimización, y así sucesivamente. Adhiriendo a las convenciones del patrón LINQ , dichas implementaciones disfrutan de el mismo soporte de integración de idioma y herramienta que los operadores estándar de consulta .

[...]

http://msdn.microsoft.com/library/bb308959.aspx