Fundamentos de LINQ. Linq To XML. Recursos



Documentos relacionados
Prólogo del autor... xv. Agradecimientos... xvii. Parte 1. Métodos anónimos... 3

ADO.NET Entity Framework

Integración de Sistemas. Parte II. Diseño e implementación de aplicaciones Web con.net

Funcionalidad del lenguaje integrado de consultas (LINQ), con ejemplos en Visual Basic.NET

27/10/2008. Investigación L.A.C.A. BIENVENIDOS. 3 de Junio de 2008 Buenos Aires. Guillermo Defino Células UAI.

Programación de Objetos.Net C# LDP / DUOC-AV

Programa de actualización profesional ACTI.NET. Desarrollo de Aplicaciones Web con ASP.NET MVC 5.0 y C#

Curso: Programación con Microsoft Visual C SHARP 2010.

Técnico Superior en Programación con Microsoft Visual Basic 2010

Curso: Programación con Microsoft Visual Basic 2010.

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

ADO.NET. Arquitectura de ADO.NET

Práctica sobre compartición de instancias remotas.

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

Convirtiendo arboles de expresión lambda en diferentes strings.

XQuery. Jose Emilio Labra Gayo Departamento de Informática Universidad de Oviedo. XQuery

Programación en Internet. Proceso selectivo de promoción interna para el acceso a escalas del grupo A, subgrupo A1. Ref. PI-02/12

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

Curso: Desarrollo de aplicaciones para escritorio y acceso de datos con.net FRAMEWORK 4.

GUÍA DE TRABAJO N 11 LENGUAJE C# Programación de Software Articulación SENA Grado 10 Ing. Néstor Raúl Suarez Perpiñan Página 2 de 11

Curso de Java POO: Programación orientada a objetos

Índice de contenidos Iniciación a VB.NET Bases de Datos

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

XPath en el aula. Nieves Carralero Colmenar I.E.S Ramón y Cajal. Albacete ncarralero@jccm.es

PROGRAMANDO BASES DE DATOS PostgreSQL INTRODUCCIÓN INTRODUCCIÓN A LAS BASES DE DATOS (L1)

Tema 11 Bases de datos. Fundamentos de Informática

BASE DE DATOS: ENFOQUE ORIENTADO A OBJETOS. Dámaso López Aragón

Pruebas de unidad con JUnit

Contenido. Capítulo 1 Visual Studio.net 2013: Introducción. Capítulo 2 Visual C# 6.0: Introducción. Alfaomega

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Un poco de culturilla...1 Crear un servicio Web...1 Usar servicios web...6

El lenguaje de programación Java

Resultados de Aprendizaje

ADMINISTRACIÓN DE BASE DE DATOS

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

MANUAL BÁSICO DEL LENGUAJE SQL

PROGRAMA FORMATIVO MICROSOFT ACCESS 2003 (COMPLETO)

Unidad 9:GESTIÓN Y ALMACENAMIENTO DE LA INFORMACIÓN EN FORMATOS XML

10550 Programming in Visual Basic with Microsoft Visual Studio 2010

Marcos de Desarrollo. Diseño e implementación de aplicaciones Web con.net

SQL (Structured Query Language)

Capa de Persistencia y Acceso a Datos con ADO.NET Entity Framework

Los patrones Inversio n de Control (IoC) e Inyeccio n de Dependencias (DI). Co mo hacer consultas LINQ ma s abstractas.

Programación páginas web. Servidor (PHP)

Oracle 12c DISEÑO Y PROGRAMACIÓN

PROGRAMA FORMATIVO MICROSOFT ACCESS 2007 (COMPLETO)

.NET Compact Framework

Base de datos Procedimientos Almacenados y Funciones

1

WEB SERVICES TUTORIAL. Tutorial completo para poder crear y utilizar Web Services con las configuraciones más usadas de forma profesional.

CURSO DE SQL SERVER 2005

Patrones para persistencia (I) Ingeniería del Software II

Bases de Datos Relacionales

03.04 Unity. Integración de Sistemas. Parte II. Diseño e implementación de aplicaciones Web con.net

Programación Orientada a Objetos con Java

ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Programación de sitios web Act 11: Reconocimiento de la unidad 3

Procesadores de lenguaje Tema 5 Comprobación de tipos

Curso Programación Orientada a Objectos con C# y Visual Studio 2010

SINTAXIS DE SQL-92. <definición de esquema >::= CREATE SCHEMA <cláusula de nombre de esquema> [ <elemento de esquema>... ]

ÍNDICE. Introducción... Capítulo 1. Novedades de Access

DEPARTAMENTO: Informática. MATERIA: Programación. NIVEL: 1º Desarrollo de Aplicaciones Multiplataforma

8 SQL SERVER 2008 RA-MA

Entity Framework 6 Para qué sirve?

Programa de actualización profesional ACTI.NET. Desarrollo de aplicaciones empresariales con ASP.NET MVC y Visual Studio 2010

Contenido. Capítulo 1: Introducción a Visual Studio.NET 1. Capítulo 3: Datos y programación en Visual Basic.NET 47

Entrarás a formar parte de nuestra bolsa de empleo a la que acuden las empresas en busca de nuestros alumnos.

Structured Query Language (SQL) Fundamentos de Bases de Datos InCo

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Almacenamiento de documentos XML

Microsoft Access 2010 (Completo)

CONSULTAS DE RESUMEN SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

MAESTRO DE PHP PHP NIVEL 1

m022a Curso Programación Avanzada con Visual Basic 2010, 24 h

INDICE Programación Introducción Capitulo 21 BASIC Capitulo 22. COBOL Capitulo 23 DELPHI Capitulo 24. FORTRAN Capitulo 25.

Diplomado Java. Descripción. Objetivo. A quien está dirigido. Requisitos. Beneficios

CURSOS LATINOAMÉRICA

BASES DE DATOS OFIMÁTICAS

: COMPUTACIÓN E INFORMATICA : Ingeniería de Software Ingeniería de Redes y Comunicaciones : Administración de Bases de Datos I : T-INF127

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Referencia SQL en la versión de HUGOSQL White Paper por: HUGOSQL 2012

Objetos y Clases en Java. ELO 329: Diseño y Programación Orientados a Objetos

Acceso a bases de datos MySQL con PHP

Parte III. Características del proyecto. Web corporativa. Aplicación gestión. Comandas. Gestión cocina.

PROGRAMACIÓN PÁGINAS WEB CON PHP

Introducción a ASP.NET

UNIVERSIDAD LATINOAMERICANA DE CIENCIA Y TECNOLOGIA DEPARTAMENTO DE INGENIERIA DE SISTEMAS LICENCIATURA EN DESARROLLO DE SOFTWARE

CURSO DE ESPECIALISTA EN DESARROLLO DE APLICACIONES WEB

Introducción a los Sistemas de Gestión de Bases de Datos

ASP.NET PROGRAMA FORMATIVO. Modalidad: Teleformación. Duración: 56 horas. Objetivos:

Laboratorio Informix. Stored Procedures Triggers

XMLNode y XMLDocument en el aula

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Bases de Datos 2. Teórico

Programación Orientada a Objetos en C#.NET CAPÍTULO 8 E V E N T O S. Ing. Bruno López Takeyas, M.C.

IMPLEMENTACIÓN DE UN PROTOTIPO DE SOFTWARE DE E-LEARNING PARA LA ENSEÑANZA DE SQLSERVER UTILIZANDO MICROSOFT SILVERLIGHT

8 MICROSOFT SQL SERVER 2008 R2. CURSO PRÁCTICO RA-MA

Transcripción:

Eduardo Quintás

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

Lenguaje Integrado de Consultas: LINQ

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

C# 3.0 - Objetivos Integrar objetos, datos relacionales l 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;} } public Passenger(string id, string name, DateTime birthdate) // OPCIONAL!!!! { Id=id; Name=name; BirthDate = birthdate; } Ai Asignaciónió de Campos o Propiedades Passenger p = new Passenger () { Id = A4, Name = Cabezabolo, Manolo }; Passenger p = new Passenger(); p.id = A4 ; p.name = Cabezabolo, Manolo ;

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 namespace MisCosas { public static class Extensiones { public static string Concatenar(this IEnumerable<string> strings, string separador) { } } } using MisCosas; Incluir extensiones en el ámbito string[] nombres = new string[] { Edu", Juan", Manolo" }; string s = nombres.concatenar(", "); IntelliSense! obj.foo(x, y) XXX.Foo(obj, x, y)

Expresiones Lambda 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; } } Delegado genérico 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 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 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 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 { pid p.id, pname}; p.name passengers.where(p => c.citizenship == ES").Select(p => new { p.id, p.name });

Introduciendo LINQ Inferencia Tipos Variables Locales Métodos Extensores var pasajerosnacionales = from p in passengers where p.citizenship == ES" select new {p.id, p.name}; Expresiones Lambda var pasajerosnacionales = passengers.where(p => p.citizenship== ES").Select(p => new { pid p.id, pname}); p.name}); Tipos Anónimos Expresiones de Consulta Inicializadores de Objetos

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 e de tipos, Tipos anónimos, Métodos extensores es y Inicialización de objetos Altamente extensible Múltiples l proveedores Objects, XML, DataSets, SQL, Entities WMI, Sharepoint, Excel incluso para Google, Flickr, Amazon

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

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

Expresión de Consulta Empieza con from Cero o más from, join, let, where, o from id in source orderby { 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 ] Continuación into opcional Termina con select o group by

Expresiones de Consulta Proyección Filtrado Comprobación Union Agrupación Agregación Partición Conjunto Select <expr> Where <expr>, Distinct Any(<expr>), All(<expr>) <expr> Join <expr> On <expr> Equals <expr> Group By <expr>, <expr> Into <expr>, <expr> Group Join <decl> On <expr> Equals <expr> Into <expr> Count(<expr>), Sum(<expr>), Min(<expr>), Max(<expr>), Avg(<expr>) Skip [ While ] <expr>, Take [ While ] <expr> Union, Intersect, Except Ordenación Order By <expr>, <expr> [Ascending Descending ]

Operadores de Consulta Expresión de consulta de Linq Partición Conjunto Conversión Generación Cuantificación Elementos Agregados Where(), Select(), SelecMany(), OrderBy(), ThenBy(), OrderByDescending(), ThenByDescending(), GroupBy(), Join(), GroupJoin() Take(), Skip(), TakeWhile(), SkipWhile() Distinct(), Union(), Intersect(), Except() ToArray(), ToList(), ToDictionary(), ToLookup(), AsEnumerable(), Cast<T>(), OfType<T>() Range(), Repeat<T>(), Empty<T>(), Concat(), Reverse() Any(), All(), Contains(), SequenceEqual() First(), Last(), Single(), ElementAt(), DefaultIfEmpty(). {método}ordefault() Count(), LongCount(), Max(), Min(), Sum(), Average(), Aggregate()

Lenguaje Integrado de Consultas: LINQ

LINQ To Objects Aplicable en colecciones genéricas y arrays que están en 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

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 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().Elements().ElementsBeforeSelf(),.ElementsAfterSelf().Descendants{AndSelf}().Ancestors{AndSelf}().Attributes() Cargan o Guardan de un stream un documento XML Secuencia de elementos contenidos Elementos hermanos anteriores o posteriores en el mismo nivel del árbol Secuencia aplanada de todos los elementos hijos Secuencia aplanada de todos los elementos padres 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") 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> </Country> <Flight Code="..."> <ArrivalDate>..</ArrivalDate> </Flight> </Passenger>... new XElement("PassengerList", </PassengerList> </TSAInformationForm> XElement nuevo = new XElement("TSAInformationForm", new XAttribute("Date", DateTime.Now), new XElement("SourceID", "883829HFGHMT"), 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"); S l")

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 Interface Lógica de negocio Almacén ADO.NET 3.0: Entity Framework public class Facade { Oracle public static IList<Blog> GetAllBlogUpdatedSince(UpdatedSince period) public { partial class BlogContext : ObjectContext { Modelo Lógico public partial DateTimeclass date Blog = FacadeHelper.getPeriod(period); Clases : EntityObjects EF public { ObjectQuery<BlogPost> BlogPosts UI / Data using { public (BlogContext static CreateBlog(int ctx = new BlogContext()) blogid, UIC Fachada Provider { get string seriestitle, bool needsreviewer) SqlServer, SqlServer Webforms, Stateless, { IQueryable<Blog> { blogs = from blog Gestión Modelo Oracle, in ctx.blogs using BlogsSample.BusinessLogic.ADONET30; Console App, Short lived Blog if blog ((this._blogposts = where new Blog(); blog.blogposts.any(p == null)) ObjectContext, MySQL, => p.blogdate > date) contexts blog.blogid { select = blogid; blog; ASP.NET g protected t void Button2_Click(object t ObjectStateManager DB2, etc. Web Services blog.seriestitle sender, this._blogposts EventArgs = seriestitle; e) = return blogs.tolist<blog>(); { base.createquery<blogpost>("[blogposts]"); } blog.needsreviewer = needsreviewer; GridView2.DataSource = Facade.GetAllBlogUpdatedSince( CSDL } } return blog; <Schema Namespace="BlogsSample.BusinessLogic.ADONET30.Model" return this._blogposts; Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"> } UpdatedSince.LastYear); } } SGBD GridView2.DataBind(); public <EntityContainer int BlogID Name="BlogContext"> Metadata } } { Archivos CSDL, MSL y SSDL get { return this._blogid; } MSL public void <?xml version="1.0" set AddToBlogs(Blog blog) encoding="utf-8"?> <Mapping { { Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:cs"> <EntityContainerMapping base.addobject("blogs", StorageEntityContainer="dbo" blog); CdmEntityContainer="BlogContext"> this.onblogidchanging(value); } <EntitySetMapping Name="BlogPosts"> this.reportpropertychanging( Def. ReportPropertyChanging("BlogID"); Visual del Modelo <MappingFragment this._blogid Archivo.EDMX StoreEntitySet="BlogPosts"> = Edmgen.exe StructuralObject.SetValidValue(value); <ScalarProperty Name="BlogPostID" ColumnName="BlogPostID" /> this.reportpropertychanged("blogid"); this.onblogidchanged(); } <EntitySet t Name="BlogPosts" " EntityType="BlogsSample.BusinessLogic.ADONET30.Model.BlogPost" l B i i l t" / <EntityTypeMapping i TypeName="IsTypeOf(BlogsSample.BusinessLogic.ADONET30.Model.BlogPost)"> T l B i l } SSDL <?xml } version="1.0" encoding="utf-8"?> <Schema Namespace="BlogsSample.BusinessLogic.BlogsModel.Store" l B i l St " Alias="Self" lf" 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" />

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 tystate t y para a 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 ObjectStateManager 1 ObjectContext CurrentValues OriginalValues State IsRelationship Caché de Entidades Gestión de Identidad, estado y cambios en las Entidades * Blog BlogPost BloggerCtx BlogPostId: int BlogEntry: string EntityKey EntityState: Added, Deleted, Detached, Changed, Unchanged PropertyChanged Blogs: ObjectQuery BlogPosts: ObjectQuery AddToBlogs( ) AddToBlogPosts( ) Hereda: Attach(..) Dettach(..) Add(..) Delete(..), Refresh(..) SaveChanges(..) etc.

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

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 Partición Conjunto Conversión Generación Cuantificación Elementos Agregados Where(), Select(), SelecMany(), OrderBy(), ThenBy(), OrderByDescending(), ThenByDescending(), GroupBy(), Join(), GroupJoin() Take(), Skip() Distinct(), Union(), Intersect(), Except() ToArray(), ToList(), ToDictionary(), ToLookup(), AsEnumerable(), Cast<T>(), OfType<T>() N/A Any(), All() First(), Last(), ElementAt(). {método}ordefault() Count(), LongCount(), Max(), Min(), Sum(), Average()

Cómo hacer una consulta Establecer el contexto Using g( (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( Include( Aircraft ) ) select f; Carga explícita if (!aflight.aircraft.isloaded) aflight.aircraft.load(); ft

Modelo ER

Modelo EF

Lenguaje Integrado de Consultas: LINQ

Recursos MSDN: http//msdn.microsoft.com 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