Lenguaje Integrado de consultas LINQ

Slides:



Advertisements
Presentaciones similares
FUNDAMENTALS OF THE JAVA PROGRAMMING LANGUAGE
Advertisements

Introducción a C#.
Características Generales y Entornos de Desarrollo
Framework de.Net Infraestructura sobre la que se reúne todo un conjunto de lenguajes y servicios que simplifican el desarrollo de aplicaciones Entorno.
3/24/2017 3:58 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
3/24/2017 3:59 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
3/24/2017 4:02 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Curso de java básico (scjp)
Herencia en C#.
Tablas. Descripción general Introducción a las tablas Creación de tablas Uso de tablas.
Fundamentos de la programación orientada a objetos
Creación y destrucción de objetos
Uso de variables de tipo referencia
Mario Cortés Flores Consultor SharePoint en Renacimiento Coordinador SUGES Coautor de:
Modelando aplicaciones
Código: HOL-SQL30. Dos tipos de datos nuevos de tipo Spatial: - Geography (superficie elipsoidal) - Geometry (superficie plana) Tipos de datos en 2.
Orientación a Objetos con Java SE
Desarrollo de Aplicaciones para Internet
Lenguaje de consulta de Hibernate
ORCAS La nueva generación de Visual Studio Octavio Hernández Plain Concepts Developer Advisor David Salgado Microsoft División.
Julio Pacheco SQL SERVER 2005 XML APRENDIENDO CON EJEMPLOS.
Objetos y Clases en Java
Tema 3 J2EE Java Database Connectivity Temas Selectos de Cómputo Grupo 912.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
TALLER DE PROGRAMACIÓN III
Java Orientado a Objetos CLASES,OBJETOS Y MÉTODOS
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Técnicas avanzadas de programación Interfaces
Igor Santos Grueiro. Ahora tenemos datos y datos …
SCJP Sun Certified Programmer for Java 6
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Facultad I · Prof. Dr. Volkert Brosda 1 XQuery una herramienta para trabajar con XML Volkert Brosda.
Servicios Web. Servicios web Son programas con funcionalidad accesible a través de protocolo http que permiten la ejecución remota de métodos y funciones.
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Sintaxis de C# (Declaraciones y Tipos)
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.
Patrones Creacionales
Contenido: 1- Que es el .Net Framework 2- Arquitectura en .Net
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.
Diseñando la arquitectura de aplicaciones empresariales. Acceso al SQL Server.- Autenticación de usuario:
Language Integrated Query Johnny Halife Microsoft Student Ambassador Southworks.
Módulo 7: Programación Orientada a Objetos en Visual Basic 2005.
David Salgado MVP C# David Salgado MVP C# Desarrollo Web con ASP.NET.
Herencia. Introducción La idea básica es poder crear clases basadas en clases ya existentes. Cuando heredamos de una clase existente, estamos re-usando.
Bienvenidos. Desarrollo de Aplicaciones I Lic. Alfonso Felipe Lima Cortés
SISTEMA DE BASE DE DATOS Equipo #6 Integrantes :García Hernández Yaneli Tlacomulco Moncada Blanca Edith Carreto Vichique Laura Belén Rosales Titla María.
LINQ (Language-Integrated Query) Gabriel Espinoza Erices 2012 – 03 – 15.
SISTEMA DE BASE DE DATOS
Consultando Base de Datos con LINQ en C# Richard Jiménez V. Empresas América linqucatec.wordpress.com.
Yeray Caballero López Juan Pablo Quesada Nieves
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.
Abstracción El concepto de abstracción es esencial en ciencias de la computación. Un programa es en sí mismo una abstracción, un modelo de la resolución.
Acceso a Datos Erick López Ovando Licenciado en Informática.
Clases “ Es una Abstracción de un elemento del mundo real ”
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Helpers en ASP.NET MVC3. Introducción Los helpers son una herramienta muy potente para generar nuestro propio código HTML dentro de las vistas. Los helpers.
Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Práctica 4 Versión Diseño de tipos Igualdad, representación, código,
LICETH CAJAS 3RO ASI 26/10/2010. Es un lenguaje de programación diseñado para crear una amplia gama de aplicaciones que se ejecutan en.NET Framework,
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Concepto de Tipo y Subtipo Diseño e Implementación Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Unidad Didáctica 10 Versión.
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Servicios Web-SOA Aula: Fomento 05/06/2006 a 08/05/2006.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Helpers en ASP.NET MVC3. Introducción Los helpers son una herramienta muy potente para generar nuestro propio código HTML dentro de las vistas. Los helpers.
Bienvenidos.
Fundamentos básicos del lenguaje C#. Parte 1 Introducción a C#
Transcripción de la presentación:

Lenguaje Integrado de consultas LINQ Eduardo Quintás

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

Novedades en C#3.0 Lenguaje Integrado de Consultas: LINQ

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

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

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 };

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

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”;

“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”

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

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!

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

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";

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

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

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

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 });

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

Fundamentos de LINQ Lenguaje Integrado de Consultas: LINQ

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

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

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

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

Expresiones de Consulta 4/16/2017 12: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.

Operadores de Consulta 4/16/2017 12: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.

LINQ to Objects Lenguaje Integrado de Consultas: LINQ

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

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.

LINQ to XML Lenguaje Integrado de Consultas: LINQ

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

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

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

Creación de documentos Directamente con XElement XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", "206-555-0144", new XAttribute("Type", "Home")), new XElement("phone", "425-555-0145", 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");

Consultas Load(uri) (archivos, http…) Métodos Elements, Attributes, Element, Attribute … Se puede utilizar Xpath (método XPathSelectElements()) XElement element = XElement.Load(Server.MapPath(@"~\XmlFiles\rssMiniNova.xml")); … XElement element = XElement.Load(@"http://www.mininova.org/rss.xml?cat=8"); 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 };

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");

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

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

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="http://schemas.microsoft.com/ado/2006/04/edm"> <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="09.00.3042" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> <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

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

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

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.

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.

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 > @date", new ObjectParameter("date",date)); IQueryable<Blog> query = from posts in ctx.BlogPosts where posts.BlogDate > date select posts.Blogs;

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

Arquitectura de LINQ To Entities

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()

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() …

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();

Modelo ER

Modelo EF

Recursos Lenguaje Integrado de Consultas: LINQ

Recursos Libros: MSDN: http//Msdn.microsoft.com 101 Linq Samples: http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx Blogs: ADO.NET Team Blog: http://blogs.msdn.com/adonet/ Blog de Dany Simons: http://blogs.msdn.com/dsimmons/ Blog de Unai Zorrilla: http://geeks.ms/blogs/unai/ Blog de Octavio Hdez.: http://geeks.ms/blogs/ohernandez/ Libros: “C# 3.0 y LINQ”, Octavio Hernández. Krasis Press 2007. ISBN: 978-84-935489-1-9 “ADO.NET Entity Framework”, Unai Zorrilla, Octavio Hernández, Eduardo Quintás. Krasis Press 2008. ISBN: 978-84-935489-9-5