Sunteți pe pagina 1din 30

LINQ (Language Integrated Queries)

Federico Daniel Colombo thepirat000@hotmail.com

Codigo\LINQ Ejemplos\LINQ_Ejemplos.sln Codigo\LINQ EJ1\LINQ_EJ1.sln

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

1. Introduccin

LINQ permite crear expresiones de consulta, es decir, usar las instrucciones tpicas 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 caractersticas de Inferencia de tipos, Tipos annimos, Extensiones, etc. Todos los arreglos, listas, etc, permiten las consultas LINQ.

La variable qry es una coleccin genrica y enumerable de integers. Ms exactamente: System.Collections.Generic.IEnumerable(Of Integer).

La coleccin devuelta se puede recorrer con un bucle For Each. Consulta equivalente en su forma de expresin lambda

1. Introduccin

continuacin

Las consultas se llevan a cabo mediante extensiones de las colecciones genricas.


Algunas de estas extensiones son:
De proyeccin: De restriccin: De elemento: De ordenamiento: Cuantificadores: De conversin: 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 cdigo de VB o C#. Estas sentencias luego son convertidas en llamadas a las extensiones y expresiones lambda. La aplicacin LINQPad permite utilizar LINQ de forma idntica que VS2008, pero simplifica el mapeo de tablas de SQL, y adems cuenta con la funcin Dump() que permite imprimir el resultado de una consulta sin necesidad de un bucle For Each.
Algunos de los ejemplos de esta presentacin estn en el formato de LINQPad.
Operadores Linq.bmp

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

2. Proyecciones

Proyeccin en un tipo annimo

Al recorrer la coleccin 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. proy_.vb

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

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 parmetro de una expresin lambda para referirse a la posicin del elemento dentro de la coleccin. En este caso se obtienen los elementos que estn en posiciones pares (claudia, maria y juan).

Filtros Take y Skip (operadores de particin)


Se ignoran los primeros dos elementos y se obtienen los siguientes dos elementos. En este caso la consulta devuelve Maria y Raul. filtro_.vb

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

4. Ordenamiento

Las extensiones OrderBy y OrderByDescending permiten ordenar una secuencia bajo un criterio especificado.

Se ordena la coleccin de strings nombres por el tamao de sus elementos en forma descendente.

La misma consulta en sintaxis Lambda.

OrderBy.vb

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

5. Joins

Para relacionar dos o ms colecciones de datos puede utilizarse la expresin Join.

Esta instruccin ser reemplazada por su equivalente en lambda que utiliza la extensin Join

La misma consulta sin utilizar el Join. En este caso la instruccin ser reemplazada por la extensin SelectMany. Esta forma es ms lenta.

El resultado:

Join.linq

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

6. Agrupamiento

Para agrupar elementos de una coleccin se utiliza la expresin 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 coleccin devuelta (g) ser una coleccin 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. Slo las carpetas que tengan ms de 2 archivos.

Group.linq

6. Agrupamiento

Para poder acceder a la llave del grupo es necesario guardarla en una variable. En este caso k.

Cada elemento de la coleccin devuelta contendr a su vez dos elementos: la llave k y el grupo g.

Iterando en un grupo con la extensin GroupBy:

Se puede acceder a la propiedad Key de cada elemento (grupo) devuelto.

Group.linq

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

7. Operadores de elemento

Son operadores (extensiones) que permiten seleccionar un elemento de una coleccin.


First-Last: Devuelve el primer-ltimo elemento de la secuencia (que cumple cierta condicin). Single: Devuelve el nico elemento de la secuencia (que cumple cierta condicin). Produce una excepcin si la secuencia contiene ms 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 OperadoresElemento.vb

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

8. Mtodos de agregacin

Son operadores (extensiones) que permiten aplicar una operacin a un conjunto de datos de una coleccin. 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 annimo y no una coleccin enumerable.

Equivalente accediendo directamente a la extensin Sum.

Se puede devolver ms de una agregacin por consulta, en ese caso la consulta retorna un tipo annimo. Agregacion.vb

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

9. Cuantificadores

Los cuantificadores son las extensiones Contains, Any y All. Buscan en una secuencia de elementos y evalan si la secuencia cumple o no una condicin. Retornan un valor booleano.

Contain s
Determina si un elemento pertenece a la coleccin.

Any
o bien: Determina si algn elemento de la coleccin comple cierta condicin.

All
Determina si todos los elementos de la coleccin cumplen cierta condicin. Cuantificadores.vb

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

10. LINQ to SQL


Permite la creacin y manejo de la capa de acceso a datos contra una BD relacional. LINQ to SQL slo 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 travs de atributos y utilizando en mtodo GetTable.

LINQ_EJ1.sln LINQ_EJ2.sln

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

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 ms de una vez, hagan referencia a la misma instancia de la clase que las representa. Algunos de los mtodos de un DataContext son:
GetTable Refresh SubmitChanges ExecuteQuery
Retorna una tabla de la BD
System.Data.Linq.Table(Of T)

Actualiza los objetos desde la BD


Actualiza la BD desde los objetos Ejecuta querys SQL directamente en la BD

Indice
Introduccin 2. Proyecciones (select) 3. Filtros 4. Ordenamiento 5. Joins 6. Agrupamiento 7. Operadores de elemento (first, last, single) 8. Mtodos de agregacin (sum, min, max) 9. Cuantificadores (any, all, contains) 10.LINQ to SQL 11.DataContext 12.Transacciones
1.

12. Transacciones

En LINQ existen 3 tipos de transacciones:


Explcita local
Si la propiedad Transaction del DataConext hace referencia a una transaccin (IDbTransaction), las diferentes llamadas a SubmitChanges() se ejecutarn en el contexto de esa transaccin. Ser responsabilidad del usuario indicar en qu momento se completar la transaccin.

Explcita distribuible
Si las llamadas a SubmitChanges() estn dentro de un TransactionScope, de System.Transactions, LINQ no crear una transaccin y no cerrar la conexin. Ser responsabilidad del usuario indicar en qu momento se completar la transaccin. Estas transacciones deben utilizarse slo cuando se requieran transacciones multi-servidor.

Implcita
Al llamar al mtodo SubmitChanges(), si no se est en ninguno de los casos anteriores (propiedad Transaction, TransactionScope), LINQ crear una transaccin local con todos los cambios pendientes en la base de datos.

Transacciones.vb

12. Transacciones

Explcita Local
Se asigna la propiedad Transaction. Las diferentes llamadas a SubmitChanges() se ejecutan en la misma transaccin local.

Explcita Distribuible
Las llamadas a SubmitChanges() estn dentro de un TransactionScope. Se ejecutan en una misma transaccin distribuida. Implica DTS y referencia a System.Transactions. Slo usar en aplicaciones multi-servidor.

Implcita Local
Por defecto, cada llamada a SubmitChanges() se ejecuta en una transaccin local direfente. Transacciones.vb

Referencias

LINQPad

http://www.linqpad.net/

Cdigo, artculos .NET

http://www.thecodeproject.com

Microsoft MSDN

http://msdn.microsoft.com

Artculo diferencias entre VB y C#

http://www.codeproject.com/KB/dotnet/vbnet_c__difference.aspx

Manual imprescindible VB2005 Guillermo Som Cerezo - Anaya 2004

S-ar putea să vă placă și