LINQ es un amplio conjunto de tecnologías, basadas en (por ejemplo) una sintaxis de comprensión de consultas, por ejemplo:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
que es mapeado por el compilador en código:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
y aquí comienza la verdadera magia. Tenga en cuenta que no hemos dicho lo que Foo
hay aquí, ¡y al compilador no le importa! Siempre que pueda resolver algún método adecuado llamado Where
que pueda tomar una lambda, y el resultado de eso tenga algún Select
método que pueda aceptar la lambda, es feliz.
Ahora considera que el lambda puede ser compilado , ya sea en un método anónimo (delegado, para LINQ a objetos, que incluye LINQ a conjunto de datos), o de una expresión de árboles (un modelo de tiempo de ejecución que representa la lambda en un modelo de objetos ).
Para los datos en memoria (típicamente IEnumerable<T>
), simplemente ejecuta el delegado, de manera precisa y rápida. Pero para IQueryable<T>
la representación de objeto de la expresión (a LambdaExpression<...>
) puede separarla y aplicarla a cualquier ejemplo de "LINQ-to-Something".
Para bases de datos (LINQ-to-SQL, LINQ-to-Entities), esto podría significar escribir TSQL, por ejemplo:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Pero podría (para ADO.NET Data Services, por ejemplo) significar escribir una consulta HTTP.
Ejecutar una consulta TSQL bien redactada que devuelve una pequeña cantidad de datos es más rápido que cargar una base de datos completa en la red y luego filtrar en el cliente. Sin embargo, ambos tienen escenarios ideales y escenarios completamente equivocados.
El objetivo y el beneficio aquí es permitirle usar una sintaxis única, comprobada estática para consultar una amplia gama de fuentes de datos y hacer que el código sea más expresivo (el código "tradicional" para agrupar datos, por ejemplo, no lo es muy claro en términos de lo que está tratando de hacer: se pierde en la masa de código).