Investigación L.A.C.A. BIENVENIDOS 3 de Junio de 2008 Buenos Aires Guillermo Defino Células UAI http://uaicel.uai.edu.ar/ 1
Un problema práctico 5 Stored Procedures Sistema Objeto Recursos DataAccess Agenda Qué es LINQ Standard Query Operations DLINQ Conclusiones 2
Qué es LINQ? La programación hoy en día Desarrollo Orientado a Objetos Datos en tecnologías no OO. Distintos entornos de Desarrollo No Intellisense, late bound, verbose T-SQL vs..net Framework Impedance Mismatch Database World Transactions Nulls - 3-value logic Normalized Data Declarative Queries Transparency Programming World Exception Handling Different nulls Objects Imperative operations Encapsulation The LINQ Project C# VB Others.NET Language Integrated Query Standard Query Operators DLinq (ADO.NET) XLinq (System.Xml) <book> <title/> <author/> <year/> <price/> </book> Objects SQL WinFS XML 3
Arquitectura from c in db.customers where c.city == "London" select new { c.name, c.phone } Application LINQ Query Objects SubmitChanges() DLinq (ADO.NET) Services: - Change tracking - Concurrency control - Object identity SQL Query Rows SQL or Stored Procs select Name, Phone from customers where city = 'London' SQLServer Una consulta hoy en día SqlConnection c = new SqlConnection( ); c.open(); SqlCommand cmd = new SqlCommand( @"SELECT c.name, c.phone FROM Customers c WHERE c.city = @p0" ); cmd.parameters.addwithvalue("@po", "London"); DataReader dr = c.execute(cmd); while (dr.read()) { string name = dr.getstring(0); string phone = dr.getstring(1); DateTime date = dr.getdatetime(2); } dr.close(); Queries entre comillas Argumentos literales Resultados no tipados No hay checkeos en compilación 4
Una consulta con LINQ public class Customer { public int Id; public string Name; public string Phone; } Table<Customer> customers = db.customers; var contacts = from c in customers where c.city == "London" select new { c.name, c.phone }; Clases que describen tablas Las tablas son colecciones El query es nativo del lenguaje Validación en tiempo de compilación En qué esta basado LINQ? En las innovaciones introducidas por C# 2.0 y C# 3.0 5
Objetivos de C# 3.0 Integración de OOP, Relacional y Xml. Basarse en los fundamentos de C# 2.0. Compilar bajo el CLR 2.0 No atar los lenguajes a APIS especificos. Compatibilidad hacia atrás. En qué esta basado LINQ? Innovaciones C# 3.0 Métodos de Extensión Agregar metodos a clases (incluso selladas) Notación de cascada de puntos (tipica en OOP) Fácil de escribir Expresiones Lambda Notación más clara y funcional Se pueden omitir los tipos de datos, se infieren. Puede ser una expresión o una secuencia de sentencias Inicialización de Objetos Ya no es necesario declarar tantas sobrecargas del c tor como inicializaciones posibles hay del objeto. Inicialización de Collections Tipos Anónimos Sirven para el resultado de las querys Inferencia de Tipos Codificación más clara Posibilidad de trabajar con tipos anónimos 6
Expresiones Lambda C#3.0 Una expresión Lambda es una forma más simple de escribir métodos anónimos, en vez de: F f = delegate(int r) { return Math.PI*r*r; }; Escribir: F f = r => Math.PI*r*r; También soporta tipos por inferencia, idéntico a expresiones delegadas. Diferencia trivial, pero comparemos estas dos: Heights (ages, delegate(int a) { return 50+a*0.07; }); Heights (ages, a => 50+a*0.07); Las expresiones Lambda expressions son de Lisp (1960); in fact 1941 Agenda Qué es LINQ Standard Query Operations DLINQ Conclusiones 7
Standard Query Operations Accediendo Objetos con LINQ Expresiones de Consulta con LINQ from id in source { from id in source where condition } [ orderby ordering, ordering, ] select expr group expr by key [ into id query ] Empieza con from Puede contirnuar con un into Seguido de cero o mas from o where (opcional) orderby Termina con un select o con un group by Operaciones de Consulta de LINQ Restricción Proyección Ordenación Agrupación Cuantificación Partición Conjuntos Elementos Agregación Conversion Casting Where Select, SelectMany OrderBy, ThenBy GroupBy Any, All Take, Skip, TakeWhile, SkipWhile Distinct, Union, Intersect, Except First, FirstOrDefault, ElementAt Count, Sum, Min, Max, Average, Fold ToArray, ToList, ToDictionary OfType<T> 8
Una Consulta con LinQ Query Expressions (c#) Queries traducen a invocaciones de métodos Where, Join, OrderBy, Select, GroupBy, from c in customers where c.city == "Hove" select new { c.name, c.phone }; customers.where(c => c.city == "Hove").Select(c => new { c.name, c.phone }); Expresiones Lambda 9
Agenda Qué es LINQ Standar Query Operations DLINQ Conclusiones DLINQ Datos Relacionales con DLINQ Mapeo a través de atributos Mapeo manual o automatico (built-in tool) Persistencia Control de cambios automático DataContext Bases de Datos fuertemente tipadas 10
Caracteristicas Language Integrated Query Checkeos en tiempo de compilación, IntelliSense Sintaxsis tipo SQL Soporte para jerarquias y relaciones Carga de objetos inteligentes Lazy o Inmediata Accediendo a datos relacionales con DLINQ 11
Ejemplos de DLinQ Conectarse a una Base de Datos. private static String connstring=@"attachdbfilename= <blabla>\data\northwnd.mdf'; Server='.\SQLEXPRESS'; Integrated Security=SSPI"; private Northwind db = new Northwind(connString); Northwind es una subclase de DataConnection, especialmente generada por la Base de datos Northwind. Northwind es una Base de Datos de ejemplo usada por Microsoft. DLinQ: from-where-select Consulta var q = from c in db.customers where c.city == "London select c; foreach (var cust in q) Console.WriteLine(cust.CompanyName); Ejecutar q no realiza una consulta a la base de datos. Solo cuando el bucle foreach requiere el resultado de q, la consulta será realizada. 12
Características Updates automáticos Usando optimistic concurrency Transacciones Integradas con System.Transactions Update único con LINQ 13
DLinQ: Update único var q = from c in db.customers where c.customerid == "ALFKI select c; Customer cust= db.customers.first(c=>c.customerid=="alfki"); cust.contacttitle = "Vice President"; db.submitchanges(); Nada ocurre sobre la base actual hasta que db.submitchanges() es llamado. Este lanza una excepción si el registro cust sobre la base ha sido actualizado por otros (optimistic concurrency) Agenda Qué es LINQ Standar Query Operations DLINQ Conclusiones 14
Conclusiones Para más información Data Access and Storage Developer Center: The LINQ Project http://msdn.microsoft.com/netframework/future/linq/ C# 3.0 Hands On Lab LINQ Hands On Lab http://staff.southworks.net/blogs/johnny http://www.ajlopez.net 15
Programas MSDN Desarrollador Cinco Estrellas Estás avanzando en el camino de las estrellas? www.dce2005.com Plan MAS Capacitación gratuita y becas laborales www.microsoft.com/argentina/mas WebCasts en nuestro idioma www.microsoft.com/spanish/msdn/latam/mediacenter/ Grupos de Usuarios, información, y mucho más en MSDN: www.microsoft.com/spanish/msdn/argentina Preguntas 16
Muchas gracias por tu atención Tu potencial. Nuestra pasión. Guillermo Defino Carlos Martínez Maximiliano Eskinja Facundo Bustos Sebastián Luna Miguel Costa http://ilaca. /blogspot.com 17