LINQ (Language-Integrated Query) Gabriel Espinoza Erices 2012 – 03 – 15.

Slides:



Advertisements
Presentaciones similares
SQL Y BASES DE DATOS A TRAVÉS DE LA WEB
Advertisements

Introducción Lenguaje de manipulación de datos (Data Manipulation Language) Permite a los usuarios llevar a cabo las tareas de consulta o manipulación.
Estadísticas en SQL Server Rocío Contreras Águila, Primer Semestre 2010.
BASE DE DATOS OBJETO RELACIONAL
XML XQuery.
Lenguajes de programación
Neo4j – Una guía rápida de devniel.com Parte II - Por Daniel Flores
ACCESO A BASES DE DATOS ORACLE CON PHP
Lenguaje de consulta de Hibernate
Julio Pacheco SQL SERVER 2005 XML APRENDIENDO CON EJEMPLOS.
IBD Clase 15.
PL/SQL Francisco Moreno Universidad Nacional.
Oracle, orientado a objetos
OPERACIONES DE RECUPERACIÓN. WHERE ciudad =‘Las Palmas’; de los suministradores Obtener el código y la situación de Las Palmas SELECT sn, situacion FROM.
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
SQL.
Especialista en Business Intelligence Integration Services SSIS Transformaciones (Parte 2) Microsoft SQL Server 2008 R2 Suscribase a
Universidad del Cauca – FIET – Departamento de Sistemas CAPITULO 5 Agregando Datos Usando Funciones de Grupo.
Bases de Datos Relacionales
SQL Básico Prof. Nelliud D. Torres.
SQL el Structured Query Language no es mas que un lenguaje estándar de comunicación con bases de datos.
SQL SERVER Reporting Services
PL/SQL Francisco Moreno Universidad Nacional.
Subconsultas Avanzadas
Bases de datos en la Web n Las bases de datos permiten almacenar de una forma estructurada y eficiente toda la información de un sitio web n Ventajas –Proporcionar.
ESTRUCTURA DE DATOS EN JAVA
Universidad del Cauca – FIET – Departamento de Sistemas CAPITULO 6 Subconsultas.
 ANGULO MENDEZ, Angelo  LEVANO CASTILLA, Carlos  PARDO FIGUEROA HERENCIA, Jhonatan  QUISPE ARCOS, Hans  RAMIREZ GAMBOA, Marlon.
XQuery. 2 Introducción De acuerdo al incremento en la cantidad de información que es almacenada, intercambiada y presentada usando XML, la habilidad para.
© 2010 DUOC Sede Antonio Varas. Todos los Derechos Reservados.
COMANDOS SQL.
COMANDOS DML DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio,
Diseñando la arquitectura de aplicaciones empresariales. Acceso al SQL Server.- Autenticación de usuario:
IBD CLASE 15. SQL Lenguaje de Consultas Estruturado (SQL) ◦Lenguaje de trabajo estándard para modelo relacional ◦Componentes ◦DDL: Data Definition Language.
Language Integrated Query Johnny Halife Microsoft Student Ambassador Southworks.
CAPITULO 4 Despliegue de Datos Desde Múltiples Tablas
Programación en Visual Basic Lección #8: SQL Por Antonio F. Huertas.
CONSULTAS SENCILLAS A LA BASE DE DATOS
Autora: Francisca Montañez Muñoz
LENGUAJE SQL.
Bases de Datos Sql.
COLEGIO DE BACHILLERES PLANTEL 13 XOCHIMILCO-TEPEPAN MATERIA:TIC EQUIPO:21 PRESENTACION: BASE DE DATOS ALUMNAS: Adán Millán Sánchez.
PROCEDIMIENTOS ALMACENADOS Es una consulta almacenada en la base de datos en un servidor. Los P.A. Mejoran el Rendimiento Disminuyen el tráfico. Los P.A.
Más ejemplos en SQL Francisco Moreno. S sn snombre situacion ciudad S1 Salazar 20 Londres S2 Jaramillo 10 París S3 Bernal30 París S4 Caicedo 20 Londres.
LENGUAJE ESTRUCTURADO DE CONSULTAS
COMANDOS DML DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio,
Funciones de agrupamiento y JOIN de Tablas
 La sentencia SELECT recupera todas las columnas o un subconjunto de ellas de una tabla. Esto afecta a todas las filas de la tabla, a menos que especifiquemos.
Consultas SQL. SQL SQL es un lenguaje de consulta estructurado (Structured Query Languague). Se utiliza para: Eliminar Modificar Consultar La base de.
SQL (Structured Query Language) Lenguaje orientado a bases de datos y sobre todo, al manejo de consultas; el objetivo principal de SQL es la realización.
JOIN EN MYSQL Bueno en esta presentación mostrare cosas acerca de los usos de la sentencia JOIN en mysql , mediante esta presentación planeo mostrar los.
MSSQL SERVER CURSO BÁSICO 1. CONCEPTOS BASICOS DE SQL. DESCRIPCIÓN DEL CURSO. Sesión 3: Índices Uso, Creación, Tipos, Eliminación LENGUAJE DE CONSULTAS.
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
HINTS ¿Cómo afectar el plan de ejecución? Por defecto, el SGBD tomará en cuenta el camino de ejecución (Execution Path) determinado por el optimizador.
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo SQL en PL/SQL Conceptos básicos.
¿Cómo programar un Botón para agregar registros a una base de datos?
SQL es el lenguaje de comunicación entre el programa cliente y programa servidor; Oracle es un programa servidor, en el que está la base de datos propiamente.
Bases de Datos SQL.
SQL STRUCTURED QUERY LANGUAGE
AA Gerardo Morgade Donato AA Isnel Leyva Herbella.
Unidad 6. Tema 4. Lenguaje de consultas SQL
Bases de datos II Universidad del Cauca Ing. Wilson Ortega.
Structure Query Languaje SQL. Introducción a SQL El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por.
DLM Transact SQL Sesión II Recuperación de información.
Querys a bases de datos con MS ACCESS. DEFINAMOS LOS TERMINOS: DML=Lenguaje de manipulación de datos Las sentencias DML permiten generar consultas para.
DML Transact SQL Sesión VI Trabajando con subconsultas.
DML Transact SQL Sesión V Consultando múltiples tablas.
DML Transact SQL Sesión III Agrupando y resumiendo información.
Structure Query Languaje
Transcripción de la presentación:

LINQ (Language-Integrated Query) Gabriel Espinoza Erices 2012 – 03 – 15

INTRODUCCIÓN LINQ es una innovación para disminuir la brecha entre el mundo de los objetos y el mundo de los datos.

INTRODUCCIÓN En Visual Studio, se pueden escribir consultas LINQ en VB o C# con: – Bases de datos SQL Server (Linq to SQL) – Documentos XML (Linq to XML) – DataSets ADO.NET (Linq to DataSet) – Colecciones de objetos que soporten IEnumerable o IEnumerable Requiere.NET Framework 3.5+

QUERYABLE TYPES Los tipos que soportan IEnumerable o derivan de interfaces como IQueryable son llamados Queryable Types Un objeto “queryable type” no requiere modificación ni trato especial para servir como datasource de LINQ. Si los datos orígenes no están en memoria como “queryable type”, el proveedor de LINQ debe representarlo como si estuviera.

LINQ TO SQL COMO QUERYABLE TYPE Con LINQ to SQL, primero se crea un mapeo objeto-relacional en tiempo de diseño, se crean las querys contra esos objetos. Luego en tiempo de ejecución, LINQ to SQL maneja la comunicación con la base de datos.

LA QUERY La query especifica qué información obtener de una o varias fuentes. Opcionalmente la query también puede especificar como esos datos deben ser ordenados, agrupados y formados antes de ser retornada. Una query tiene 3 clausulas: – from: Especifica el data source – where: aplica el filtro – select: especifica el tipo de los elementos retornados.

EJECUCIÓN DE LA QUERY La query por si misma no ejecuta ninguna acción ni retorna datos. Solo almacena la información requerida para producir los resultados cuando la consulta sea ejecutada en un punto posterior.

FORZAR EJECUCIÓN INMEDIATA Las querys que realizan funciones de agregado sobre un rango de fuentes, primero deben iterar sobre esos elementos. Ej: Count, Max, Average, First, etc. Notar que estas consultas no retornan una colección, sino que un valor. Para forzar la ejecución inmediata de cualquier query y almacenar en cache sus resultados, se pueden usar el ToList o ToArray

Son equivalentes SINTAXIS

OPERACIONES BÁSICAS Delcaración del DataSource Range Variable DataSource Declaración de filtros Da “forma” al resultado de la query

ORDER BY & JOINS Ordenamiento Un join crea asociaciones entre secuencias que no estén explicitamente modeladas en los DataSources. En LINQ los join SIEMPRE funcionan contra objetos y no tablas de bases de datos

AGRUPAR Agrupar: Al agrupar, se forma una lista de listas. La cláusula group permite agrupar los resultados basados en una llave que se especifique. Ejemplo: Los resultados agrupados por ciudad, de tal manera que los clientes de Londres o Paris son grupos individuales. En este caso cust.City es la llave. Si se necesita interactuar con el grupo, se puede usar into para crear una variable que lo referencie

CONSULTAS y TRANSFORMACIONES DE TIPOS DE DATO

LINQ y CLASES GENÉRICAS IEnumerable es la interfaz que habilita que las colecciones de clases genéricas puedan ser enumeradas usando la sentencia foreach. Las colecciones de clases genéricas soportan IEnumerable tal como las colecciones no genéricas (arraylists). Cuando veas que una query está escripta como IEnumerable, significa que la query, cuando sea ejecutada, producirá una secuencia de 0 o más objetos Customer.

LINQ y CLASES GENÉRICAS Se puede dejar que el compilador maneje la declaración genérica.

POR QUÉ LINQ VENCE A SQL Supongamos queremos hacer una consulta simple SELECT UPPER(Name) FROM Customer WHERE Name LIKE 'A%' ORDER BY Name SELECT UPPER(Name) FROM Customer WHERE Name LIKE 'A%' ORDER BY Name Ahora supongamos que estos resultados están alimentando una página web y queremos obtener solo las filas De la nada, ahora necesitamos una subquery SELECT UPPER(Name) FROM ( SELECT *, RN = row_number() OVER (ORDER BY Name) FROM Customer WHERE Name LIKE 'A%' ) A WHERE RN BETWEEN 21 AND 30 ORDER BY Name SELECT UPPER(Name) FROM ( SELECT *, RN = row_number() OVER (ORDER BY Name) FROM Customer WHERE Name LIKE 'A%' ) A WHERE RN BETWEEN 21 AND 30 ORDER BY Name

POR QUÉ LINQ VENCE A SQL Y si necesitamos agregar soporte para bases de datos anteriores a SQL SERVER 2005, se vuelve peor aún!! SELECT TOP 10 UPPER (c1.Name) FROM Customer c1 WHERE c1.Name LIKE 'A%' AND c1.ID NOT IN ( SELECT TOP 20 c2.ID FROM Customer c2 WHERE c2.Name LIKE 'A%' ORDER BY c2.Name ) ORDER BY c1.Name SELECT TOP 10 UPPER (c1.Name) FROM Customer c1 WHERE c1.Name LIKE 'A%' AND c1.ID NOT IN ( SELECT TOP 20 c2.ID FROM Customer c2 WHERE c2.Name LIKE 'A%' ORDER BY c2.Name ) ORDER BY c1.Name No solo es complicado, sino que viola el principio DRY (Don’t Repeat Yourself)

IQueryable Paginate (this IQueryable query, int skip, int take) { return query.Skip(skip).Take(take); } var thirdPage = query.Paginate (20, 10); IQueryable Paginate (this IQueryable query, int skip, int take) { return query.Skip(skip).Take(take); } var thirdPage = query.Paginate (20, 10); POR QUÉ LINQ VENCE A SQL SELECT TOP 10 UPPER (c1.Name) FROM Customer c1 WHERE c1.Name LIKE 'A%' AND c1.ID NOT IN ( SELECT TOP 20 c2.ID FROM Customer c2 WHERE c2.Name LIKE 'A%' ORDER BY c2.Name ) ORDER BY c1.Name SELECT TOP 10 UPPER (c1.Name) FROM Customer c1 WHERE c1.Name LIKE 'A%' AND c1.ID NOT IN ( SELECT TOP 20 c2.ID FROM Customer c2 WHERE c2.Name LIKE 'A%' ORDER BY c2.Name ) ORDER BY c1.Name Aquí tenemos la misma consulta pero en LINQ. La ganancia en simplicidad es clara. var query = from c in db.Customers where c.Name.StartsWith("A") orderby c.Name select c.Name.ToUpper(); var thirdPage = query.Skip(20).Take(10); var query = from c in db.Customers where c.Name.StartsWith("A") orderby c.Name select c.Name.ToUpper(); var thirdPage = query.Skip(20).Take(10); Composability: Podemos dividir la consulta y hacer métodos genéricos reutilizables

SELECT p.* FROM Purchase p LEFT OUTER JOIN Customer c INNER JOIN Address a ON c.AddressID = a.ID ON p.CustomerID = c.ID WHERE (a.State = 'WA' || p.CustomerID IS NULL) AND p.ID in ( SELECT PurchaseID FROM PurchaseItem GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 ) SELECT p.* FROM Purchase p LEFT OUTER JOIN Customer c INNER JOIN Address a ON c.AddressID = a.ID ON p.CustomerID = c.ID WHERE (a.State = 'WA' || p.CustomerID IS NULL) AND p.ID in ( SELECT PurchaseID FROM PurchaseItem GROUP BY PurchaseID HAVING SUM (SaleAmount) > 1000 ) Otro beneficio de LINQ es que puedes consultar a través de relaciones sin tener que hacer joins. var purchases = from p in db.Purchases where p.Customer.Address.State == "WA“ || p.Customer == null where p.PurchaseItems.Sum(pi => pi.SaleAmount) > 1000 select p; var purchases = from p in db.Purchases where p.Customer.Address.State == "WA“ || p.Customer == null where p.PurchaseItems.Sum(pi => pi.SaleAmount) > 1000 select p;

Parametrización: No hay que complicarse con los ataques de inyección de SQL pues la parametrización de LINQ es inline, segura y altamente legible. IQueryable GetCustomers (string state, decimal? minPurchase) { var query = Customers.AsQueryable(); if (state != null) query = query.Where (c => c.Address.State == "WA"); if (minPurchase != null) query = query.Where (c => c.Purchases.Any (p => p.Price > minPurchase.Value)); return query; } IQueryable GetCustomers (string state, decimal? minPurchase) { var query = Customers.AsQueryable(); if (state != null) query = query.Where (c => c.Address.State == "WA"); if (minPurchase != null) query = query.Where (c => c.Purchases.Any (p => p.Price > minPurchase.Value)); return query; } SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] FROM [Customer] AS [t0] SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] FROM [Customer] AS [t0] Si pasamos state y minPurchase nulos SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] FROM [Customer] AS [t0] LEFT OUTER JOIN [Address] AS [t1] ON [t1].[ID] = [t0].[AddressID] WHERE (EXISTS( SELECT NULL AS [EMPTY] FROM [Purchase] AS [t2] WHERE ([t2].[Price] AND ([t2].[CustomerID] = [t0].[ID]) )) AND ([t1].[State] SELECT [t0].[ID], [t0].[Name], [t0].[AddressID] FROM [Customer] AS [t0] LEFT OUTER JOIN [Address] AS [t1] ON [t1].[ID] = [t0].[AddressID] WHERE (EXISTS( SELECT NULL AS [EMPTY] FROM [Purchase] AS [t2] WHERE ([t2].[Price] AND ([t2].[CustomerID] = [t0].[ID]) )) AND ([t1].[State] Si pasamos ambos valores LINQ no solo agregará los predicados, sino que también los JOINS

Cuándo no usar LINQ A pesar de su poder, LINQ no deja obsoleto a SQL. Toma más del 95% de la funcionalidad de las queries, pero se seguirá necesitando SQL para: Queries que busquen máxima optimización. Queries que involucren seleccionar en tablas temporales y luego consultar esas tablas. Actualizaciones con predicados e inserciones masivas (bulk) Triggers

Tener que conocer dos lenguajes para querys no es realmente un problema, dado que de todas maneras LINQ provee una forma común para interactuar con distintas fuentes de datos. Arreglos, Listas, XML, Bases de Datos, y en general, de cualquier objeto que herede de IQueryable y IEnumerable.

Fuentes us/library/bb aspx us/library/bb aspx us/library/bb aspx us/library/bb aspx /LINQ-to-SQL-Advanced-Concepts-and- Features /LINQ-to-SQL-Advanced-Concepts-and- Features px px