27/10/2008 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 27/10/2008 Un problema práctico 5 Stored Procedures Sistema Objeto Recursos DataAccess Agenda Qué es LINQ Standard Query Operations DLINQ Conclusiones 2 27/10/2008 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 Programming World Transactions Exception Handling Nulls - 3-value logic “Different” nulls Normalized Data Objects Declarative Queries Imperative operations Transparency Encapsulation The LINQ Project C# Others… VB .NET Language Integrated Query Standard Query Operators DLinq (ADO.NET) XLinq (System.Xml) <book> <title/> <author/> <year/> <price/> </book> Objects SQL WinFS XML 3 27/10/2008 Arquitectura from c in db.Customers where c.City == "London" select new { c.Name, c.Phone } LINQ Query Application Objects SubmitChanges() Services: - Change tracking - Concurrency control - Object identity DLinq (ADO.NET) SQL Query select Name, Phone from customers where city = 'London' Rows SQL or Stored Procs SQLServer Una consulta hoy en día Queries entre SqlConnection c = new SqlConnection(…); comillas c.Open(); SqlCommand cmd = new SqlCommand( @"SELECT c.Name, c.Phone Argumentos FROM Customers c literales WHERE c.City = @p0" ); cmd.Parameters.AddWithValue("@po", "London"); DataReader dr = c.Execute(cmd); while (dr.Read()) { string name = dr.GetString(0); Resultados no string phone = dr.GetString(1); tipados DateTime date = dr.GetDateTime(2); } dr.Close(); No hay checkeos en compilación 4 27/10/2008 Una consulta con LINQ public class Customer { public int Id; public string Name; public string Phone; … } Clases que describen tablas Las tablas son colecciones Table<Customer> customers = db.Customers; var contacts = from c in customers where c.City == "London" select new { c.Name, c.Phone }; 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 27/10/2008 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 Inferencia de Tipos Sirven para el resultado de las querys Codificación más clara Posibilidad de trabajar con tipos anónimos 6 27/10/2008 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 27/10/2008 Standard Query Operations Accediendo Objetos con LINQ Expresiones de Consulta con LINQ Empieza con from from id in source Seguido de cero o mas from o where { from id in source | where condition } [ orderby ordering, ordering, … ] (opcional) orderby select expr | group expr by key [ into id query ] Termina con un select o con Puede contirnuar con un into un group by Operaciones de Consulta de LINQ Restricción Where Proyección Select, SelectMany Ordenación OrderBy, ThenBy Agrupación GroupBy Cuantificación Any, All Partición Take, Skip, TakeWhile, SkipWhile Conjuntos Distinct, Union, Intersect, Except Elementos First, FirstOrDefault, ElementAt Agregación Count, Sum, Min, Max, Average, Fold Conversion ToArray, ToList, ToDictionary Casting OfType<T> 8 27/10/2008 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 }; Expresiones Lambda customers .Where(c => c.City == "Hove") .Select(c => new { c.Name, c.Phone }); 9 27/10/2008 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 27/10/2008 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 27/10/2008 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 27/10/2008 Características Updates automáticos Usando optimistic concurrency Transacciones Integradas con System.Transactions Update único con LINQ 13 27/10/2008 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 27/10/2008 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 27/10/2008 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 27/10/2008 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