La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Lenguaje Integrado de consultas LINQ

Presentaciones similares


Presentación del tema: "Lenguaje Integrado de consultas LINQ"— Transcripción de la presentación:

1 Lenguaje Integrado de consultas LINQ
Eduardo Quintás

2 Guía Novedades en C# 3.0 Fundamentos de LINQ Linq To Objects
Linq To XML Linq To Entities Recursos

3 Novedades en C#3.0 Lenguaje Integrado de Consultas: LINQ

4 Evolución de .NET 2002 2003 2005 2006 2007 2010 VS 2002 VS 2003 VS2005
Herramienta (Visual Studio) VS 2002 VS 2003 VS2005 + Extensiones VS2008 VS2010 Lenguaje C# v1.0 VB.NET (v7.0) C# v1.1 VB.NET (v7.1) C# v2.0 VB2005 (v8.0) como antes C# v3.0 VB9 (v9.0) C# 4.0 VB10 (v10.0) Librerías Framework NetFx v1.0 NetFx v1.1 NetFx v2.0 NetFx v3.0 NetFx v3.5 NetFx V4.0 Engine (CLR) CLR v1.0 CLR v1.1 CLR v2.0 CLR v4.0

5 C# 3.0 - Objetivos Integrar objetos, datos relacionales y XML Y:
Hacer el lenguaje más conciso Añadir constructores de programación funcional No ligar el lenguaje a APIs específicas Mantenerse 100% compatible hacia atrás

6 Resultado: Métodos extensores, tipos anónimos, constructores sin parámetros, inferencia de tipos, expresiones lambda, árboles de expresión Más un poquito de azucar sintáctico … from p in Passengers where p.Citizenship == “ES” select new { p.Id, p.Name };

7 Nuevas características
Inicializadores de objetos Inferencia de tipos Tipos anónimos Métodos extensores Expresiones lambda Árboles de expresión LINQ!!!

8 Inicializadores de Objetos
public class Passenger { public string Id {get; set;} public string Name {get; set;} public DateTime BirthDate {get; set;} } Asignación de Campos o Propiedades public Passenger(string id, string name, DateTime birthDate) // OPCIONAL!!!! { Id=id; Name=name; BirthDate = birthDate; } Passenger p = new Passenger () { Id = “A4”, Name = “Cabezabolo, Manolo” }; Passenger p = new Passenger(); p.Id = “A4”; p.Name = “Cabezabolo, Manolo”;

9 “El tipo en el lado de la derecha”
Inferencia de Tipos int i = 666; string s = “Hola"; double d = 3.14; int[] numbers = new int[] {1, 2, 3}; Dictionary<int,Pedido> pedidos = new Dictionary<int,Pedido>(); var i = 666; var s = “Hola"; var d = 3.14; var numbers = new int[] {1, 2, 3}; var pedidos = new Dictionary<int,Pedido>(); “El tipo en el lado de la derecha”

10 Tipos Anónimos class XXX { public string Name; public int Age; } XXX
var o = new { Name = “Pantoja”, Age= 75 };

11 Métodos Extensores Método extensor Incluir extensiones en el ámbito
namespace MisCosas { public static class Extensiones public static string Concatenar(this IEnumerable<string> strings, string separador) {…} } Incluir extensiones en el ámbito using MisCosas; string[] nombres = new string[] { “Edu", “Juan", “Manolo" }; string s = nombres.Concatenar(", "); obj.Foo(x, y) XXX.Foo(obj, x, y) IntelliSense!

12 Expresiones Lambda Delegado genérico Tipo genérico
public delegate bool Predicate<T>(T obj); public class List<T> { public List<T> FindAll(Predicate<T> test) { List<T> result = new List<T>(); foreach (T item in this) if (test(item)) result.Add(item); return result; } Tipo genérico

13 Expresiones Lambda public class MiClase { public static void Main() {
List<Cliente> clientes = ObtenerListaClientes(); List<Cliente> locales = clientes.FindAll( new Predicate<Cliente>(CiudadIgualCoruna) ); } static bool CiudadIgualCoruna(Cliente c) { return c.Ciudad == “A Coruña";

14 Expresiones Lambda Delegado Anónimo public class MiClase {
public static void Main() { List<Cliente> clientes = ObtenerListaClientes (); List<Cliente> locales = clientes.FindAll( delegate(Cliente c) { return c.Ciudad == “A Coruña"; } ); } Delegado Anónimo

15 Expresiones Lambda Expresión Lambda public class MiClase {
public static void Main() { List<Cliente> clientes = ObtenerListaClientes (); List<Cliente> locales = clientes.FindAll( (Clientes c) => {return c.Ciudad == “A Coruña";} ); } Expresión Lambda

16 Expresiones Lambda Expresión Lambda public class MiClase {
public static void Main() { List<Cliente> clientes = ObtenerListaClientes (); List<Cliente> locales = clientes.FindAll(c => c.Ciudad == “A Coruña"); } Expresión Lambda

17 Introduciendo LINQ Todos estos nuevos aspectos se trasladan a métodos extensores sobre colecciones: Pueden transformarse en árboles de expresiones from p in passengers where p.Citizenship== “ES" select new { p.Id, p.Name }; passengers .Where(p => c.Citizenship == “ES") .Select(p => new { p.Id, p.Name });

18 Introduciendo LINQ var pasajerosNacionales = from p in passengers
Expresiones de Consulta var pasajerosNacionales = from p in passengers where p.Citizenship == “ES" select new {p.Id, p.Name}; Inferencia Tipos Variables Locales Expresiones Lambda var pasajerosNacionales = passengers .Where(p => p.Citizenship== “ES") .Select(p => new { p.Id, p.Name}); Métodos Extensores Tipos Anónimos Inicializadores de Objetos

19 Fundamentos de LINQ Lenguaje Integrado de Consultas: LINQ

20 LINQ: Lenguage Integrated Query
Lenguaje de consulta universal de primer orden en C# y VB9 Reducir el conocimiento de distintas formas de consulta. Parecido a lo que ya conocemos : SQL Basado en Lambda Cálculo, Tipado fuerte, Ejecución retrasada (deferred) Utiliza características nuevas del lenguaje como: Inferencia de tipos, Tipos anónimos, Métodos extensores y Inicialización de objetos Altamente extensible Múltiples proveedores Objects, XML, DataSets, SQL, Entities WMI, Sharepoint, Excel… incluso para Google, Flickr, Amazon

21 Language INtegrated Query (LINQ)
VB C# Others… .NET Language-Integrated Query LINQ enabled data sources LINQ enabled ADO.NET LINQ To DataSets To SQL To Entities Relational LINQ To Objects Objects LINQ To XML <book> <title/> <author/> <price/> </book> XML

22 Arquitectura de LINQ Fuente implementa IEnumerable<T>
var query = from p in passengers where p.Citizenship== “ES" select p Fuente implementa IEnumerable<T> Fuente implementa IQueryable<T> System.Linq.Enumerable Basado en delegados System.Linq.Queryable Basado en árbol de expresión XML Objetos SQL DataSets Entities

23 Continuación into opcional
Expresión de Consulta Empieza con from Cero o más from, join, let, where, o orderby from id in source { from id in source | join id in source on expr equals expr [ into id ] | let id = expr | where condition | orderby ordering, ordering, … } select expr | group expr by key [ into id query ] Termina con select o group by Continuación into opcional

24 Expresiones de Consulta
4/16/ :22 PM Expresiones de Consulta Proyección Select <expr> Filtrado Where <expr>, Distinct Comprobación Any(<expr>), All(<expr>) Union <expr> Join <expr> On <expr> Equals <expr> Agrupación Group By <expr>, <expr> Into <expr>, <expr> Group Join <decl> On <expr> Equals <expr> Into <expr> Agregación Count(<expr>), Sum(<expr>), Min(<expr>), Max(<expr>), Avg(<expr>) Partición Skip [ While ] <expr>, Take [ While ] <expr> Conjunto Union, Intersect, Except Ordenación Order By <expr>, <expr> [ Ascending | Descending ] Group Join is essentially “Left outer join” for hierarchical data © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

25 Operadores de Consulta
4/16/ :22 PM Operadores de Consulta Expresión de consulta de Linq Where(), Select(), SelecMany(), OrderBy(), ThenBy(), OrderByDescending(), ThenByDescending(), GroupBy(), Join(), GroupJoin() Partición Take(), Skip(), TakeWhile(), SkipWhile() Conjunto Distinct(), Union(), Intersect(), Except() Conversión ToArray(), ToList(), ToDictionary(), ToLookup(), AsEnumerable(), Cast<T>(), OfType<T>() Generación Range(), Repeat<T>(), Empty<T>(), Concat(), Reverse() Cuantificación Any(), All(), Contains(), SequenceEqual() Elementos First(), Last(), Single(), ElementAt(), DefaultIfEmpty(). {método}OrDefault() Agregados Count(), LongCount(), Max(), Min(), Sum(), Average(), Aggregate() Group Join is essentially “Left outer join” for hierarchical data © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

26 LINQ to Objects Lenguaje Integrado de Consultas: LINQ

27 LINQ To Objects Aplicable en colecciones genéricas y arrays que están en memoria (heap) Métodos extensores para colecicones y arrays Using System.Linq; Las expresiones de consulta devuelven IEnumerable<T> Fundamental para gestionarlas de modo flexible

28 Ejemplos de consultas 4/16/2017 12:22 PM
Group Join is essentially “Left outer join” for hierarchical data © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

29 LINQ to XML Lenguaje Integrado de Consultas: LINQ

30 XML en .Net Framework Clases XmlTextReader y XmlTextWriter
L/E secuencial: Eficiente pero complejo Serialización y Deserialización: System.Xml.Serialization Atributos en clases, S/D contra streams (ficheros, memoria…) Clases XmlDocument, XmlNode … en System.Xml Implementan un DOM por árboles Ahora: LINQ To XML Extensión de LINQ de .Net Simple, Flexible, Potente, nuevo DOM. Manipulación y consulta con LINQ

31 LINQ To XML Importando System.Xml.Linq Nuevo DOM:
Construcción funcional: XElement Independencia del documento Permite crear fragmentos XML sin asociarlos a un XDocument Texto como valor Hojas del árbol XML se convierten a tipos por valor de .Net

32 Clase XElement Los métodos están sobrecargados para localizar elementos concretos. Métodos más representativos .Load() / .Save() Cargan o Guardan de un stream un documento XML .Elements() Secuencia de elementos contenidos .ElementsBeforeSelf(), .ElementsAfterSelf() Elementos “hermanos” anteriores o posteriores en el mismo nivel del árbol .Descendants{AndSelf}() Secuencia aplanada de todos los elementos hijos .Ancestors{AndSelf}() Secuencia aplanada de todos los elementos padres .Attributes() Atributos del elemento

33 Creación de documentos
Directamente con XElement XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", " ", new XAttribute("Type", "Home")), new XElement("phone", " ", new XAttribute("Type", "Work")), new XElement("Address", new XElement("Street1", "123 Main St"), new XElement("City", "Mercer Island"), new XElement("State", "WA"), new XElement("Postal", "68042")))); contacts.Save("contacts.xml");

34 Consultas Load(uri) (archivos, http…)
Métodos Elements, Attributes, Element, Attribute … Se puede utilizar Xpath (método XPathSelectElements()) XElement element = XElement element = var query = from i in element.Elements("channel").Elements("item") select new { Title = i.Element("title").Value, Posted = DateTime.Parse(i.Element("pubDate").Value), Size = Convert.ToDecimal(i.Element("enclosure"). Attribute("length").Value) Link = i.Element("enclosure").Attribute("url").Value, Category = i.Element("category").Value };

35 Transformación de documentos
Utilizando Linq y XElement Método Save(stream/fichero… ), ToString() … <TSAInformationForm Date="..."> <SourceID>...</SourceID> <PassengerList> <Passenger DocumentId="..."> <Name>..</Name> <Country>..</Country> <Flight Code="..."> <ArrivalDate>..</ArrivalDate> </Flight> </Passenger> ... </PassengerList> </TSAInformationForm> XElement nuevo = new XElement("TSAInformationForm", new XAttribute("Date", DateTime.Now), new XElement("SourceID", "883829HFGHMT"), new XElement("PassengerList", from p in pasajeros select new XElement("Passenger", new XAttribute("DocumentId", p.Id), new XElement("Name", p.Name), new XElement("Country", p.Citizenship), new XElement("Flight", new XAttribute("Code",p.Code), new XElement("ArrivalDate",p.Arrival) )))); nuevo.Save("TsaSendFile.xml");

36 LINQ to Entities Arquitectura Entitiy Framework (EF) LINQ to Entities
Ejemplos

37 Arquitectura de EF OR/M + Objetos de Servicio
Soporte de varios SGDB: EntityClientProvider Herramientas y lenguaje para mapeado Modelo Conceptual: EntityObject Contextos tipados: ObjectContext Gestión de Entidades: ObjectStateManager Consulta: eSQL y LINQ To Entities

38 Patrón arquitectónico empresarial típico ADO.NET 3.0: Entity Framework
Interface Lógica de negocio Almacén ADO.NET 3.0: Entity Framework Oracle UI / UIC Webforms, Console App, ASP.NET Web Services Fachada Stateless, Short lived contexts public class Facade { public static IList<Blog> GetAllBlogUpdatedSince(UpdatedSince period) DateTime date = FacadeHelper.getPeriod(period); using (BlogContext ctx = new BlogContext()) IQueryable<Blog> blogs = from blog in ctx.Blogs where blog.BlogPosts.Any(p => p.BlogDate > date) select blog; return blogs.ToList<Blog>(); } Modelo Lógico Clases EntityObjects EF Data Provider SqlServer, Oracle, MySQL, DB2, etc. public partial class BlogContext : ObjectContext { public ObjectQuery<BlogPost> BlogPosts { get if ((this._BlogPosts == null)) this._BlogPosts = base.CreateQuery<BlogPost>("[BlogPosts]"); } return this._BlogPosts; public void AddToBlogs(Blog blog) base.AddObject("Blogs", blog); public partial class Blog : EntityObject { public static Blog CreateBlog(int blogID, string seriesTitle, bool needsReviewer) Blog blog = new Blog(); blog.BlogID = blogID; blog.SeriesTitle = seriesTitle; blog.NeedsReviewer = needsReviewer; return blog; } public int BlogID get { return this._BlogID; } set this.OnBlogIDChanging(value); this.ReportPropertyChanging("BlogID"); this._BlogID = StructuralObject.SetValidValue(value); this.ReportPropertyChanged("BlogID"); this.OnBlogIDChanged(); ... SqlServer Gestión Modelo ObjectContext, ObjectStateManager using BlogsSample.BusinessLogic.ADONET30; protected void Button2_Click(object sender, EventArgs e) { GridView2.DataSource = Facade.GetAllBlogUpdatedSince( UpdatedSince.LastYear); GridView2.DataBind(); } SGBD CSDL <Schema Namespace="BlogsSample.BusinessLogic.ADONET30.Model" Alias="Self" xmlns=" <EntityContainer Name="BlogContext"> <EntitySet Name="BlogPosts" EntityType="BlogsSample.BusinessLogic.ADONET30.Model.BlogPost" / MSL <?xml version="1.0" encoding="utf-8"?> <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS"> <EntityContainerMapping StorageEntityContainer="dbo" CdmEntityContainer="BlogContext"> <EntitySetMapping Name="BlogPosts"> <EntityTypeMapping TypeName="IsTypeOf(BlogsSample.BusinessLogic.ADONET30.Model.BlogPost)"> <MappingFragment StoreEntitySet="BlogPosts"> <ScalarProperty Name="BlogPostID" ColumnName="BlogPostID" /> SSDL <Schema Namespace="BlogsSample.BusinessLogic.BlogsModel.Store" Alias="Self" ProviderManifestToken=" " xmlns=" <EntityContainer Name="dbo"> <EntitySet Name="BlogComments" EntityType="BlogsSample.BusinessLogic.BlogsModel.Store.BlogComments" /> Metadata Archivos CSDL, MSL y SSDL Def. Visual del Modelo Archivo .EDMX | Edmgen.exe ADO.NET 3.0

39 Modelo Conceptual en EF
Clases prescriptivas Structural Object > EntityObject Gestión de identidad (EntityKey) Gestión de cambios (TrackingEntity event) Soporte para relaciones (EntityCollection) Estado (EntityState) Son clases parciales Posibilidad de clases IPOCO Implementar IEntityWithKey, IEntityWithChangeTracker, IEntityWithRelationship

40 Object Context Clase derivada (generada) de ObjectContext
Tipado Fuerte: Manipulación del Modelo Conceptual Consultas/Recuperación: Blogs: ObjectQuery; Inserciones: .AddToBlog(Blog b); .AddObject(…), Borrado: .DeleteObject Persistencia: .SaveChanges(); Gestión de la conexión Metadata (a partir de CSDL) Almacen o caché en memoria de objetos Tracking de estado objetos: .Attach(..), .Dettach(..) ObjectStateManager MergeOption

41 ObjectStateManager Seguimiento del estado de entidades
Gestiona entradas EntityStateEntry para cada Entidad en almacen en memoria. Cuando se cargan (Query, Attach): Unchanged Cuando se crean (AddObject): Added Cuando se modifican: Changed Cuando se borran: Deleted Cuando se destruye el ObjectContext: Detached Al aplicar ObjectContext.SaveChanges() en Added, Changed, cambia a Unchanged.

42 Diseño: Entity Framework
EntityObject 1 EntityStateEntry CurrentValues OriginalValues State IsRelationship ObjectStateManager 1 Caché de Entidades Gestión de Identidad, estado y cambios en las Entidades ObjectContext Blog BlogPost * BlogPostId: int BlogEntry: string EntityKey EntityState: Added, Deleted, Detached, Changed, Unchanged PropertyChanged BloggerCtx Blogs: ObjectQuery BlogPosts: ObjectQuery AddToBlogs(…) AddToBlogPosts(…) Hereda: Attach(..) Dettach(..) Add(..) Delete(..), Refresh(..) SaveChanges(..) etc.

43 Consultas Entity SQL LINQ to Entities
Dialecto SQL indep. de gestor con soporte para: Tipos enriquecidos, relaciones, herencia… Strings que se resuelven en tiempo de ejecución LINQ to Entities Todas las ventajas de LINQ (tipado fuerte, expresiones lambda) Lenguaje que se resuelve en tiempo de compilación Aprovechamos el tipado fuerte, la inferencia y el Intellisense de Visual Studio Menos errores en ejecución ObjectQuery<Blog> query = ctx.CreateQuery<Blog>( "SELECT VALUE bp.Blogs FROM BlogPosts as bp WHERE bp.BlogDate new ObjectParameter("date",date)); IQueryable<Blog> query = from posts in ctx.BlogPosts where posts.BlogDate > date select posts.Blogs;

44 LINQ To Entities Diferencias con LINQ To Objects y To XML
Las consultas tienen el tipo ObjectQuery<T> Implementa IQueryable<T> y no IEnumerable<T> Necesita Árboles de expresión para construir el SQL final. Cuando se enumeran los resultados: query1.FirstOrDefault(), query1.ToList() … Se ejecuta la consulta SQL y devuelve un IEnumerable<T> No están disponibles todos los operadores de Linq To Objects o To XML

45 Arquitectura de LINQ To Entities

46 Operadores disponibles
Expresión de consulta de Linq Where(), Select(), SelecMany(), OrderBy(), ThenBy(), OrderByDescending(), ThenByDescending(), GroupBy(), Join(), GroupJoin() Partición Take(), Skip() Conjunto Distinct(), Union(), Intersect(), Except() Conversión ToArray(), ToList(), ToDictionary(), ToLookup(), AsEnumerable(), Cast<T>(), OfType<T>() Generación N/A Cuantificación Any(), All() Elementos First(), Last(), ElementAt(). {método}OrDefault() Agregados Count(), LongCount(), Max(), Min(), Sum(), Average()

47 Cómo hacer una consulta
Establecer el contexto Using (FlightContext ctx = new FlightContext()) { …} Dentro del contexto construír la consulta Obtener los IQueryable<T> del Contexto IQueryable<Flight> query = from f in ctx.Flights where p.To==“MAD” select f; Ejecutar la consulta Con un operador de conversión query.ToList(); query.FirstOrDefault() …

48 Otras consideraciones
Pensar la consulta con el modelo conceptual Navegar por las relaciones y no con joins Los objetos recuperados dentro del contexto son gestionados por el ObjectStateManager (tracking) Cuando se cierra el contexto NO. Carga Perezosa de relaciones (dentro de un contexto) ¡¡No nos lo vamos a traer todo!! Si en el where se utiliza una relación, ésta se carga Carga implícita from f in ctx.Flights.Include(“Aircraft”) select f; Carga explícita if (!aflight.Aircraft.IsLoaded) aflight.Aircraft.Load();

49 Modelo ER

50 Modelo EF

51 Recursos Lenguaje Integrado de Consultas: LINQ

52 Recursos Libros: MSDN: http//Msdn.microsoft.com
101 Linq Samples: Blogs: ADO.NET Team Blog: Blog de Dany Simons: Blog de Unai Zorrilla: Blog de Octavio Hdez.: Libros: “C# 3.0 y LINQ”, Octavio Hernández. Krasis Press ISBN: “ADO.NET Entity Framework”, Unai Zorrilla, Octavio Hernández, Eduardo Quintás. Krasis Press ISBN:


Descargar ppt "Lenguaje Integrado de consultas LINQ"

Presentaciones similares


Anuncios Google