LINQ
(Language In Integrated tegrated Queries)
Federico Daniel Colombo
[email protected]
Codigo\LINQ Ejemplos\LINQ_Ejemplos.sln Codigo\LINQ EJ1\LINQ_EJ1.sln
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1. Introducción
LINQ permite crear expresiones de consulta, es decir, usar las instrucciones típicas de las consultas de SQL: SELECT, FROM, JOIN, WHERE, ORDER BY, GROUP BY. La idea principal es la de poder realizar funciones de consulta de datos (XML, colecciones y objetos, bases de datos, etc) de forma integrada. Para que LINQ sea posible, se agregaron las características de Inferencia de tipos, Tipos anónimos, Extensiones, etc. Todos los arreglos, listas, etc, permiten las consultas LINQ.
La variable qry es una colección genérica y enumerable de integers. Más exactamente: System.Collections.Generic.IEnumerable(Of Integer).
La colección devuelta se puede recorrer con un bucle For Each. Consulta equivalente en su forma de expresión lambda
1. Introducción
Las consultas se llevan a cabo mediante extensiones de las colecciones genéricas. Algunas de estas extensiones son: De proyección: De restricción: De elemento: De ordenamiento: Cuantificadores: De conversión:
continuación
Select, SelectMany Where First, Single, Last, FirstOrDefault OrderBy, OrderByDescending Any, All, Contains ToArray, ToList, ToDictionary
Visual Studio 2008 facilita las consultas y el acceso a estas extensiones, permitiendo escribir sencilla e intuitivamente sentencias tipo SQL dentro del código de VB o C#. Estas sentencias luego son convertidas en llamadas a las extensiones y expresiones lambda. La aplicación LINQPad permite utilizar LINQ de forma idéntica que VS2008, pero simplifica el mapeo de tablas de SQL, y además cuenta con la función Dump() que permite imprimir el resultado de una consulta sin necesidad de un bucle For Each. Algunos de los ejemplos de esta presentación están en el formato de LINQPad.
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
2. Proyecciones
Proyección en un tipo anónimo
Al recorrer la colección se puede acceder a las propiedades Nombre y Espacio.
Uso de Let
Let permite declarar variables temporales para usar en cualquier parte de la consulta
Subquerys
Obtiene todas las carpetas de C:\ y los archivos dentro de éstas menores a 1KB. La palabra From puede aparecer varias veces en una consulta indicando un subquery.
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
3. Filtros
Filtro Simple
•
Se obtienen los elementos que finalizan con “a”
Filtro Indexado Tanto en el Where como en el Select puede utilizarse el segundo parámetro de una expresión lambda para referirse a la posición del elemento dentro de la colección. En este caso se obtienen los elementos que estén en posiciones pares (claudia, maria y juan). •
•
Filtros Take y Skip (operadores de partición) Se ignoran los primeros dos elementos y se obtienen los siguientes dos elementos. En este caso la consulta devuelve Maria y Raul .
• •
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
4. Ordenamiento
Las extensiones OrderBy y OrderByDescending permiten ordenar una secuencia bajo un criterio especificado.
Se ordena la colección de strings “nombres” por el tamaño de sus elementos en forma descendente. •
La misma consulta en sintaxis Lambda.
•
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
5. Joins
Para relacionar dos o más colecciones de datos puede utilizarse la expresión Join.
Esta instrucción será reemplazada por su equivalente en lambda que utiliza la extensión Join •
La misma consulta sin utilizar el Join. En este caso la instrucción será reemplazada por la extensión SelectMany. Esta forma es más lenta. •
El resultado:
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
6. Agrupamiento
Para agrupar elementos de una colección se utiliza la expresión Group By.
Archivos agrupados por carpetas.
Luego del Group by , la variable “a” queda fuera del alcance, por eso se utiliza la sentencia Into para poder acceder a los elementos de cada grupo. Cada elemento de la colección devuelta (g) será una colección de Archivos de cada grupo. •
•
Luego del Group by, puede ir una sentencia where que filtre los datos ya agrupados. Es el equivalente al Having de SQL.
Archivos agrupados por carpetas. Sólo las carpetas que tengan más de 2 archivos.
6. Agrupamiento
Para poder acceder a la llave del grupo es necesario guardarla en una variable. En este caso k.
Cada elemento de la colección devuelta contendrá a su vez dos elementos: la llave k y el grupo g. •
Iterando en un grupo con la extensión GroupBy:
Se puede acceder a la propiedad Key de cada elemento (grupo) devuelto. •
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
7. Operadores de elemento
Son operadores (extensiones) que permiten seleccionar un elemento de una colección. ◦ First-Last: Devuelve el primer-último elemento de la secuencia (que cumple cierta condición).
◦ Single: Devuelve el único elemento de la secuencia (que cumple cierta condición). Produce una excepción si la secuencia contiene más de un elemento. ◦ ElementAt: Devuelve el elemento en un índice determinado. ◦ FirstOrDefault, LastOrDefault, SingleOrDefault, ElementAtOrDefault :
Igual que las anteriores pero en caso de no existir elemento, devuelve un valor por defecto.
OperadoresElemento.linq
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
8. Métodos de agregación
Son operadores (extensiones) que permiten aplicar una operación a un conjunto de datos de una colección. Algunos son: Min, Max, Sum, Count, Average
La palabra Aggregate puede comenzar una consulta y en ese caso la consulta devolverá un valor discreto o un valor anónimo y no una colección enumerable. •
Equivalente accediendo directamente a la extensión Sum.
•
Se puede devolver más de una agregación por consulta, en ese caso la consulta retorna un tipo anónimo. •
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
9. Cuantificadores
Los cuantificadores son las extensiones Contains, Any y All. Buscan en una secuencia de elementos y evalúan si la secuencia cumple o no una condición. Retornan un valor booleano.
Contain s Determina si un elemento pertenece a la colección.
•
Any o bien: Determina si algún elemento de la colección comple cierta condición.
•
All Determina si todos los elementos de la colección cumplen cierta condición.
•
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
10. LINQ to SQL
Permite la creación y manejo de la capa de acceso a datos contra una BD relacional. LINQ to SQL sólo soporta Microsoft SQL Server, pero existen desarrollos independientes para MySql, Oracle y PostgreSQL. Para poder utilizar LINQ to SQL se necesita: ◦ Un objeto DataContext ◦ Mapeo de las entidades a clases (DBML, SqlMetal.exe, manualmente) ◦ Referencias a System.Linq y System.Data.Linq
La Capa de Acceso a Datos se crea de alguna de estas formas: ◦ Agregando un archivo LINQ to SQL (.dbml) al proyecto. ◦ Generando un archivo de clases con la herramienta SqlMetal.exe. ◦ Mapeando las clases manualmente a través de atributos y utilizando en método GetTable.
LINQ_EJ1.sln
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
11. DataContext
El objeto DataContext de LINQ es el encargado de hacer de interface entre las entidades que son representadas (SQL) y el programa que las utiliza. Es la fuente de todas las entidades mapeadas. Garantiza que las entidades que se consulten más de una vez, hagan referencia a la misma instancia de la clase que las representa. Algunos de los métodos de un DataContext son: ◦ ◦ ◦ ◦
GetTable Refresh
Retorna una tabla de la BD
System.Data.Linq.Table(Of T)
Actualiza los objetos desde la BD
SubmitChanges Actualiza la BD desde los objetos ExecuteQuery
Ejecuta querys SQL directamente en la BD
Indice 1.
Introducción 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Métodos de agregación (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
12. Transacciones
En LINQ existen 3 tipos de transacciones: ◦ Explícita local
Si la propiedad Transaction del DataConext hace referencia a una transacción (IDbTransaction), las diferentes llamadas a SubmitChanges() se ejecutarán en el contexto de esa transacción. Será responsabilidad del usuario indicar en qué momento se completará la transacción.
◦ Explícita distribuible
Si las llamadas a SubmitChanges() están dentro de un TransactionScope , de System.Transactions, LINQ no creará una transacción y no cerrará la conexión. Será responsabilidad del usuario indicar en qué momento se completará la transacción.
Estas transacciones deben utilizarse sólo cuando se requieran transacciones multi-servidor.
◦ Implícita
Al llamar al método SubmitChanges(), si no se está en ninguno de los casos anteriores (propiedad Transaction , TransactionScope ), LINQ creará una transacción local con todos los cambios pendientes en la base de datos.
12. Transacciones
Explícita Local Se asigna la propiedad Transaction. Las diferentes llamadas a SubmitChanges() se ejecutan en la misma transacción local. • •
Explícita Distribuible Las llamadas a SubmitChanges() están dentro de un TransactionScope. Se ejecutan en una misma transacción distribuida. Implica DTS y referencia a System.Transactions. Sólo usar en aplicaciones multi-servidor. •
• • •
Implícita Local Por defecto, cada llamada a SubmitChanges() se ejecuta en una transacción local direfente. •