Mostrando las entradas con la etiqueta LINQ. Mostrar todas las entradas
Mostrando las entradas con la etiqueta LINQ. Mostrar todas las entradas

lunes, 14 de abril de 2014

Realizar Consultas con LINQ (parte 2)

Continuando con esta entrega sobre las posibilidades que nos ofrece LINQ para realizar consultas, comenzaremos viendo de que manera simple pueden realizarse agrupamiento de datos.

(Ir a primer parte click aqui)

Tomando como base la clase empleado que utilizamos en la primer parte de esta entrega, podemos ver a continuación de que manera LINQ simplifica enormemente el proceso de agrupar datos, utilizando una sintaxis similar al GROUP BY de SQL.




Por otro lado, LINQ hace posible que se pueden ejecutar sobre cualquier objeto enumerable, muchos operados similares a los operadores que se encuentran en SQL, tales como Count, Min, Max, Avarage, Sum.




Como se ve en el ejemplo se simplifica ampliamente la posibilidad de obtener estos valores, a excepción del Count, que nos devuelve la cantidad total, el resto de los operadores requieren el nombre del campo sobre el cual se efectúa la operación, ello se realiza por medio del uso de la expresión Lambda.

LINQ suporta la unión de datos desde diferentes colecciones, usando una sintaxis similar a la utilizada por SQL, para ejemplificar esto, creamos una clase GrupoEmpleado, 

para relacionarla con el atributo IdGrupoEmpleado de la Clase Empleado






LINQ también nos otorga la posibilidad de realizar paginado de datos fácilmente, por medio de la utilización de los métodos Skip y Take. El primero de ellos, Skip, determina la

posición del primer item de la lista a considerar,  y por medio del método Take, se especifica la cantidad de items que serán retornados en la consulta LINQ.


Como puede observarse LINQ nos otorga una espectacular mejora en la legibilidad y comprensibilidad del código.

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í)

martes, 25 de marzo de 2014

Introducción a LINQ

LINQ (Microsoft.NET Language Integrated Query) es a la vez un lenguaje, y una extensión del Microsoft .NET Framework. Fue introducido con la versión 3.5 del Framework de .NET, para constituirse en un puente entre la programación de objetos y trabajar con los datos.

LINQ convierte el acceso a datos y las consultas en un lenguaje construido en Visual Basic o en Visual C#. Provee un modelo consistente para trabajar con los datos sin importar de donde vienen los datos. Por lo tanto la programación con LINQ permite utilizar todas las características propias de la programacion, para hacer el tratamiento de los datos más fácil y consistente.

LINQ cambia la manera en que accedemos y consultamos datos. Antes que LINQ fuera creado, las mayoría de las consultas se escribían y ejecutaban directamente contra la Base datos, por lo que dicho texto SQL dependía fuertemente de la tecnología subyacente.
LINQ posee dos ventajas principales:

  • La primera de ellas es que se realiza un chequeo de los objetos LINQ en tiempo de compilación, por lo que es posible de encontrar y descubrir más facilmente los errores, además de la posibilidad de utilizar IntelliSense para hacer más fácil escribir el código fuente.
  • La segunda, es que provee un modelo consistente para realizar las consultar contra todas las tecnologías de base de datos, y todo tipo de objetos, incluyendo listas, XML, arrays, etc.






LINQ permite realizar consultas a cualquier objeto que soporte la interface, IEnumerable o IEnumerable<T>; lo que serían todas las colecciones de datos, incluídos los DataSet, List<T>, Array y muchos más.

Supongamos que tenemos una lista de objetos Empleado, esta lista es llamada empleados. En dicha lista, por medio de la utilización de LINQ podremos obtener todos los empleados que trabajan en el departamento IT, de la siguiente manera:

IEnumerable<Employee> empQuery = from emp in empleados
                                 where emp.departamento == "IT"
                             select emp;

Los tipos más comunes en los que se puede grabar el resultado de LINQ, son IEnumerable<T> e IQueryable<T>, de todas maneras puede saltarse esta asignación, y utilizar, directamente la palabra reservada var:

var empQuery = from emp in empleados
               where emp.departamento == "IT"
              select emp;

Hay que tener en cuenta, que cuando se asigna la consulta LINQ a una variable sobre es eso, se guarda en la variable, pero no se ejecuta hasta que no se itera a través de la misma, por ejemplo con un bloque foreach

foreach (var emp in empQuery)
{
   Console.WriteLine(emp.departamento);
}

Otras maneras para que la consulta se ejecute, es usar algunas de las funciones de agregación: Count, Max, Average, First.

int cant = empQuery.Count();

También pueden utilizarse los métodos ToList<T> o ToArray<T> para ejecutar la consulta y guardar los resultados en una lista de objetos o en un array.

List<empleado> empQuery = (from emp in empleados
                          where emp.departamento == "IT"                                 select emp).ToList();