viernes, 11 de abril de 2014

Realizar Consultas con LINQ (parte 1)

Como ya había sido introducido previamente el tema, LINQ (Language Integrated Query), incluye tres tipos básicos de consultas, estos son:

  1. LINQ to Objects; 
  2. LINQ to XLM (XLINQ); 
  3. LINQ utilizados en contextos de bases de datos, tales como LINQ to SQL o LINQ to Entities.

Para analizar más en profundidad algunas de las posibilidades que nos ofrece LINQ, tomaremos el enfoque más simple, LINQ to Objects, este enfoque permite realizar operaciones de consultas complejas en cualquier objeto que soporte la interface IEnumerable.

Para analizar estas cuestiones, comenzaremos definiendo una clase simple: Empleado


Y posteriormente llenaremos una Lista de clase Empleado, la cual contendrá las instancias de la entidad Empleado.



Cargamos el contenido de la Lista de Empleados en una variable genérica, y posteriormente lo que se haría, sería enviar la variable a la vista correspondiente, para que el usuario vea los resultados finales (si estuviéramos en una aplicación MVC), o se podría asignar dicha variable al DataSource de una GridView (si estuavieramos trabajando con Web Forms). Para simplemente probar su funcionamiento, lo que haremos será recorrer el contenido de la variable por medio de un bucle foreach.



¿Qué pasaría si desearamos ordenar, agrupar, paginar, dicha lista? Obviamente por medio de unas cuantas líneas de código podríamos hacerlo, pero el código, algunas veces, puede resultar difícil de leer y entender para alguien que no fue el programador, por lo cual se entorpece el mantenimiento del sistema. Es aquí donde entra en juego LINQ.

Por este motivo, partir de ahora, iremos testeando las diversas posibilidades que nos ofrece LINQ, lo primero es generar la consulta LINQ simple de la siguiente manera, como se ve obtenemos un resultado similar al anterior, pero nos servirá como base para los pasos siguientes.


Analicemos en detalle, este ejemplo de LINQ Básico: primero por medio del método ObtenerEmpleados(), se obtiene la variable genérica de List<Empleado>; y posteriormente se realiza una consulta LINQ muy simple para obtener todos los objetos Empleado de la colección de Empleados.

Como puede verse la consulta definió una nueva variable e, esta variable es utilizada de dos maneras dentro de la consulta. Por un lado, definiendo dicha variable e dentro de la sentencia from, le estamos diciendo a LINQ que e representa un item individual dentro de la colección, para el ejemplo e es un objeto Empleado. Por otro lado, utilizando e, dentro de la sentencia select de la consulta, le estamos diciendo a LINQ que genere una salida que se corresponde con la estructura de e, en este ejemplo con la estructura del objeto Empleado.
Con respecto a este último punto, podemos generar una salida personalizada, es decir determinar que campos se quiere que retorne la consulta, para ello utilizamos la palabra reservada new, posterior a la sentencia select, como podemos ver en el siguiente ejemplo:



También podemos determinar cuales serán los nombres de los campos que expondrá la salida de nuestra consulta LINQ


LINQ incluye la capacidad de ordenar los resultados de nuestra consulta, utilizando la sentencia ORDER BY, y tal colo lo haríamos en una consulta SQL, puede determinarse si los datos se ordenan de manera ascendente o descendente.



Si deseamos filtrar los datos de nuestra consulta LINQ, solo es cuestion de agregar la sentencia WHERE, tal como vemos a continuación:


Si deseamos hacer un filtrado más preciso fácilmente pueden introducirse más condiciones dentro del WHERE de la consulta:


En la próxima entrega veremos cuestiones tales como el Agrupamiento de datos, funciones de agregado, paginado de resultados.

(Ir a segunda parte click aquí)