Lenguaje Integrado de Consulta - SABIA-Group ::...

52
Eduardo Quintás

Transcript of Lenguaje Integrado de Consulta - SABIA-Group ::...

Page 1: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Eduardo Quintás

Page 2: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

GuíaGuía

• Novedades en C# 3 0• Novedades en C# 3.0• Fundamentos de LINQ• Linq To Objects• Linq To Objects• Linq To XML

Li T E titi• Linq To Entities• Recursos

Page 3: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Lenguaje Integrado de Consultas: LINQ

Page 4: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Evolución de .NET2002 2003 2005 2006 2007 2010

Herramienta VS200(Visual Studio)

VS 2002 VS 2003 VS2005 VS2005+ Extensiones VS2008 VS2010

C# v1.0 C# v1.1 C# v2.0 C# v3.0 C# 4.0Lenguaje VB.NET

(v7.0)VB.NET

(v7.1)VB2005 (v8.0)

comoantes

VB9(v9.0)

VB10(v10.0)

Lib í NetFx NetFx NetFxLibreríasFramework NetFx v1.0 NetFx v1.1 NetFx v2.0 NetFx

v3.0NetFxv3.5

NetFxV4.0

Engine CLR CLR CLR como como CLRg e (CLR) CLR v1.0 CLR v1.1 CLR v2.0 antes antes CLR v4.0

Page 5: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

C# 3.0 - ObjetivosI bj d l i l XMLIntegrar objetos, datos relacionales y XML

Y: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ásMantenerse 100% compatible hacia atrás

Page 6: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Resultado: Resultado:

• Métodos extensores tipos anónimos • Métodos extensores, tipos anónimos, constructores sin parámetros, inferencia de tipos expresiones lambda árboles de expresióntipos, expresiones lambda, árboles de expresión

• Más un poquito de azucar sintáctico …p q

fromfrom p p inin PassengersPassengerswherewhere p.Citizenshipp.Citizenship == “ES”== “ES”selectselect new {new { p Idp Id p Namep Name };};select select new { new { p.Idp.Id, , p.Namep.Name };};

Page 7: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Nuevas característicasNuevas características

• Inicializadores de objetos• Inicializadores de objetos• Inferencia de tipos

Ti ó i• Tipos anónimos• Métodos extensores

i l bd• Expresiones lambda• Árboles de expresión• LINQ!!!

Page 8: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Inicializadores de ObjetosInicializadores de Objetospublic class Passenger{{

public string Id {get; set;} public string Name {get; set;}public DateTime BirthDate {get; set;}

}

A i ió d Asignación de Campos o

Propiedadespublic 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.Id A4 ;p.Name = “Cabezabolo, Manolo”;

Page 9: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

f i d iInferencia de Tiposint 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>();p y , ()

“El tipo en el lado de la derecha”

Page 10: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Tipos Anónimosclass XXX{

public string Name;bli i t Apublic int Age;

}

XXX

var o = new { Name = “Pantoja”, Age= 75 };

XXX

Page 11: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Métodos Extensores Método extensor

namespace MisCosas{

public static class Extensiones{

public static string Concatenar(this IEnumerable<string> stringspublic 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(", ");

obj.Foo(x, y)IntelliSense!

XXX.Foo(obj, x, y)IntelliSense!

Page 12: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Expresiones LambdaDelegado

public delegate bool Predicate<T>(T obj);

bli l Li t<T>

Delegadogenérico

Tipublic class List<T>{

public List<T> FindAll(Predicate<T> test) {List<T> result = new List<T>();foreach (T item in this)

Tipogenérico

foreach (T item in this)if (test(item)) result.Add(item);

return result;}…

}}

Page 13: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Expresiones Lambda

public class MiClase{

public static void Main() {List<Cliente> clientes = ObtenerListaClientes();List<Cliente> locales =

clientes FindAll(clientes.FindAll(new Predicate<Cliente>(CiudadIgualCoruna)

);}

static bool CiudadIgualCoruna(Cliente c) {return c.Ciudad == “A Coruña";

}}

Page 14: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Expresiones Lambda

public class MiClasep{

public static void Main() {List<Cliente> clientes = ObtenerListaClientes ();List<Cliente> locales =

li t Fi dAll(clientes.FindAll(delegate(Cliente c) { return c.Ciudad == “A Coruña"; }

);}

}}

Delegadoó iAnónimo

Page 15: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

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";}(Clientes c) => {return c.Ciudad == “A Coruña";}

);}

}

ExpresiónLambda

Page 16: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Expresiones Lambdap

public class MiClasepublic class MiClase{

public static void Main() {List<Cliente> clientes = ObtenerListaClientes ();List<Cliente> locales =

clientes.FindAll(c => c.Ciudad == “A Coruña");}

}

ExpresiónLambda

Page 17: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Introduciendo LINQIntroduciendo LINQ

• Todos estos nuevos aspectos se trasladan a • Todos estos nuevos aspectos se trasladan a métodos extensores sobre colecciones:▫ Pueden transformarse en árboles de expresiones▫ Pueden transformarse en árboles de expresiones

f ifrom p in passengerswhere p.Citizenship== “ES"select new { p Id p Name };select new { p.Id, p.Name };

passengers.Where(p => c.Citizenship == “ES").Select(p => new { p.Id, p.Name });

Page 18: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Introduciendo LINQvar pasajerosNacionales = Expresiones de

C l

Introduciendo LINQvar pasajerosNacionalesfrom p in passengerswhere p.Citizenship == “ES"

Consulta

I f i select new {p.Id, p.Name};InferenciaTipos Variables

Locales

var pasajerosNacionales =

ExpresionesLambda

passengers.Where(p => p.Citizenship== “ES")Select(p => new { p Id p Name});.Select(p => new { p.Id, p.Name});

MétodosExtensores InicializadoresTipos

de Objetosp

Anónimos

Page 19: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Lenguaje Integrado de Consultas: LINQ

Page 20: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

LINQ: Lenguage Integrated Query

• Lenguaje de consulta universal de primer orden en C# y VB9VB9▫ 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 e e c a de t pos, pos a ó os, étodos e te so es y Inicialización de objetos

▫ Altamente extensibleMúlti l d• Múltiples proveedores Objects, XML, DataSets, SQL, Entities WMI, Sharepoint, Excel… incluso para Google, Flickr, AmazonWMI, Sharepoint, Excel… incluso para Google, Flickr, Amazon

Page 21: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

L INt t d Q (LINQ)Language INtegrated Query (LINQ)OthersVB C# Others…VB C#

.NET Language-Integrated Query

LINQ enabled data sourcesLINQ enabled data sources

LINQ enabled ADO.NET

LINQTo Objects

LINQTo XML

LINQ enabled ADO.NET

LINQT D t S t

LINQT SQL

LINQT E titiTo Objects To XMLTo DataSets To SQL To Entities

<book><title/><author/><price/>

</book>

ObjectsObjects XMLXMLRelationalRelational

Page 22: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Arquitectura de LINQArquitectura de LINQ

var query = from p in passengers where p.Citizenship== “ES" select p

Fuente Fuente implementaimplementaIEnumerableIEnumerable<T><T>

Fuente Fuente implementaimplementaIQueryableIQueryable<T><T>

System.Linq.EnumerableBasado en delegados

System.Linq.QueryableBasado en árbol de expresión

SQLSQL DataSetsDataSetsObjetosObjetos EntitiesEntitiesXMLXML

Page 23: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

ió d C lExpresión de ConsultaEmpieza con

from id in source

pfrom

Cero o más from, join, let, where, o orderbyfrom id in source

{ from id in source |join id in source on expr equals expr [ into id ] |

orderby

join id in source on expr equals expr [ into id ] |let id = expr |where condition | Termina con

select o group byorderby ordering, ordering, … }select expr | group expr by key

select o group by

[ into id query ]Continuacióninto opcional

Page 24: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Expresiones de ConsultaProyección Select <expr>Proyección Select <expr>Filtrado Where <expr>, DistinctComprobación Any(<expr>) All(<expr>)Comprobación Any(<expr>), All(<expr>)Union <expr> Join <expr> On <expr> Equals <expr>Agrupación Group By <expr> <expr> Into <expr> <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>Partición Skip [ While ] <expr>, Take [ While ] <expr>Conjunto Union, Intersect, ExceptOrdenación Order By <expr> <expr> [ Ascending | Descending ]Ordenación Order By <expr>, <expr> [ Ascending | Descending ]

Page 25: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Operadores de ConsultaExpresión de Where() Select() SelecMany() OrderBy() ThenBy()Expresión de consulta de Linq

Where(), Select(), SelecMany(), OrderBy(), ThenBy(), OrderByDescending(), ThenByDescending(), GroupBy(), Join(), GroupJoin()

Partición Take() Skip() TakeWhile() SkipWhile()Partición Take(), Skip(), TakeWhile(), SkipWhile()

Conjunto Distinct(), Union(), Intersect(), Except()

Conversión ToArray(), ToList(), ToDictionary(), ToLookup(),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()

Page 26: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Lenguaje Integrado de Consultas: LINQ

Page 27: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

LINQ To ObjectsLINQ 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

Page 28: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Ejemplos de consultas

Page 29: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Lenguaje Integrado de Consultas: LINQ

Page 30: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

XML en Net FrameworkXML en .Net Framework• Clases XmlTextReader y XmlTextWriterClases XmlTextReader y XmlTextWriter▫ L/E secuencial: Eficiente pero complejo

• Serialización y Deserialización: ySystem.Xml.Serialization▫ Atributos en clases, S/D contra streams (ficheros, memoria…)

l l l d l• Clases XmlDocument, XmlNode … en System.Xml▫ Implementan un DOM por árbolesAhora: LINQ To XML• Ahora: LINQ To XML▫ Extensión de LINQ de .Net▫ Simple Flexible Potente nuevo DOMSimple, Flexible, Potente, nuevo DOM.▫ Manipulación y consulta con LINQ

Page 31: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

LINQ To XMLLINQ To XML• Importando System.Xml.LinqImportando 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

Page 32: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Clase XElement• Los métodos están sobrecargados para localizar elementos • 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

Métodos más representativos

.Load() / .Save() Cargan o Guardan de un stream un documento XML

.Elements() Secuencia de elementos contenidos

.ElementsBeforeSelf(), Elementos “hermanos” anteriores o posteriores en el (),

.ElementsAfterSelf()p

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

Page 33: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Creación de documentos• Directamente con XElement• 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");

Page 34: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Consultas• Load(uri) (archivos http )• Load(uri) (archivos, http…)• Métodos Elements, Attributes, Element, Attribute …• Se puede utilizar Xpath (método XPathSelectElements())• 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")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

};};

Page 35: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Transformación de documentos• Utilizando Linq y XElement• Utilizando Linq y XElement• Método Save(stream/fichero… ), ToString() …

<TSAInformationForm Date="..."><SourceID>...</SourceID><PassengerList>

<Passenger DocumentId="..."><Name>..</Name><Country> </Country>

XElement nuevo =new XElement("TSAInformationForm",

new XAttribute("Date", DateTime.Now),new XElement("SourceID", "883829HFGHMT"),new XElement("PassengerList",

<Country>..</Country><Flight Code="...">

<ArrivalDate>..</ArrivalDate></Flight>

</Passenger>... new XElement( PassengerList ,

from p in pasajerosselect new XElement("Passenger",

new XAttribute("DocumentId", p.Id),new XElement("Name", p.Name),new XElement("Country", p.Citizenship),

</PassengerList></TSAInformationForm>

new XElement("Flight", new XAttribute("Code",p.Code), new XElement("ArrivalDate",p.Arrival)

))));

S ("T S dFil l")nuevo.Save("TsaSendFile.xml");

Page 36: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

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

Page 37: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Arquitectura de EFArquitectura de EF

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

Page 38: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Patrón arquitectónico empresarial típico

ADO NET 3 0: Entity Framework

Interface Lógica de negocio Almacén

public class Facade

UI /

ADO.NET 3.0: Entity Framework

Modelo LógicoClases EntityObjects

Oracle

EFData

public partial class BlogContext : ObjectContext {…public ObjectQuery<BlogPost> BlogPostspublic partial class Blog : EntityObject

{

public class Facade{

public static IList<Blog> GetAllBlogUpdatedSince(UpdatedSince period){

DateTime date = FacadeHelper.getPeriod(period);

UI / UIC

Webforms,Console App,

ASP NET

FachadaStateless,Short livedcontexts

Gestión ModeloObjectContext,

ObjectStateManager

SqlServer

DataProviderSqlServer, Oracle, MySQL, DB2, etc.

p j y g g{

get{

if ((this._BlogPosts == null)){

{public static Blog CreateBlog(int blogID,

string seriesTitle, bool needsReviewer){

Blog blog = new Blog();blog.BlogID = blogID;

using (BlogContext ctx = new BlogContext()){

IQueryable<Blog> blogs = from blog in ctx.Blogswhere blog.BlogPosts.Any(p => p.BlogDate > date)select blog;

using BlogsSample.BusinessLogic.ADONET30;…

t t d id B tt 2 Cli k( bj t d E tA )ASP.NETWeb Services

ObjectStateManager DB2, etc.

MetadataArchivos CSDL MSL y SSDL

SGBD

CSDL<Schema Namespace="BlogsSample.BusinessLogic.ADONET30.Model" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"><EntityContainer Name="BlogContext"><E tit S t N "Bl P t " E tit T "Bl S l B i L i ADONET30 M d l Bl P t" /

this._BlogPosts = base.CreateQuery<BlogPost>("[BlogPosts]");

}return this._BlogPosts;

}}

g g gblog.SeriesTitle = seriesTitle;blog.NeedsReviewer = needsReviewer;return blog;

}public int BlogID

g;return blogs.ToList<Blog>();

} }

}

protected void Button2_Click(object sender, EventArgs e){

GridView2.DataSource = Facade.GetAllBlogUpdatedSince(UpdatedSince.LastYear);

GridView2.DataBind();}

Def. Visual del Modelo

Archivos CSDL, MSL y SSDL<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"><E tit T M i T N "I T Of(Bl S l B i L i ADONET30 M d l Bl P t)">

}…public void AddToBlogs(Blog blog)

{base.AddObject("Blogs", blog);

}

{get { return this._BlogID; }set{

this.OnBlogIDChanging(value);this ReportPropertyChanging("BlogID");

}

Def. Visual del ModeloArchivo .EDMX | Edmgen.exe

<EntityTypeMapping TypeName="IsTypeOf(BlogsSample.BusinessLogic.ADONET30.Model.BlogPost)"><MappingFragment StoreEntitySet="BlogPosts"><ScalarProperty Name="BlogPostID" ColumnName="BlogPostID" />

SSDL<?xml version="1.0" encoding="utf-8"?><S h N "Bl S l B i L i Bl M d l St " Ali "S lf"

this.ReportPropertyChanging( BlogID );this._BlogID = StructuralObject.SetValidValue(value);this.ReportPropertyChanged("BlogID");this.OnBlogIDChanged();

}}

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

...}

Page 39: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Modelo Conceptual en EF

• Clases prescriptivas▫ Structural Object > EntityObjectj y j▫ Gestión de identidad (EntityKey)▫ Gestión de cambios (TrackingEntity event)g y▫ Soporte para relaciones (EntityCollection)▫ Estado (EntityState)▫ Son clases parciales

• Posibilidad de clases IPOCO▫ Implementar IEntityWithKey,

IEntityWithChangeTracker, IEntityWithRelationship

Page 40: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Object Context• Clase derivada (generada) de ObjectContext• Tipado Fuerte: Manipulación del Modelo Conceptual▫ Consultas/Recuperación: Blogs: ObjectQuery;▫ 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)• Metadata (a partir de CSDL)• Almacen o caché en memoria de objetos• Tracking de estado objetos: ac g de estado objetos: ▫ .Attach(..), .Dettach(..) ▫ ObjectStateManager

M O ti▫ MergeOption

Page 41: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

ObjectStateManager• Seguimiento del estado de entidades• Gestiona entradas EntityStateEntry para cada Gest o a e t adas t tyState t y pa a cada

Entidad en almacen en memoria.▫ Cuando se cargan (Query, Attach): UnchangedCuando se cargan (Query, Attach): Unchanged▫ Cuando se crean (AddObject): Added▫ Cuando se modifican: ChangedCuando se modifican: Changed▫ Cuando se borran: Deleted▫ Cuando se destruye el ObjectContext: DetachedCuando se destruye el ObjectContext: Detached▫ Al aplicar ObjectContext.SaveChanges() en Added,

Changed, cambia a Unchanged.Changed, cambia a Unchanged.

Page 42: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Di ñ i kDiseño: Entity Framework1EntityObject ObjectContextObjectStateManager 1

Caché de EntidadesGestión de Identidad, estado ycambios en las Entidades

1 EntityStateEntry

CurrentValuesOriginalValuesState

BloggerCtx

cambios en las EntidadesStateIsRelationship

Bl Bl P t* BloggerCtx

Blogs: ObjectQueryBlogPosts: ObjectQueryAddToBlogs(…)AddT Bl P t ( )

Blog BlogPostBlogPostId: intBlogEntry: string…

AddToBlogPosts(…)Hereda:Attach(..)Dettach(..)Add(..)

,

EntityKeyEntityState:Added, Deleted, Detached, Changed Unchanged ( )

Delete(..),Refresh(..)SaveChanges(..) etc.

Changed, UnchangedPropertyChanged

Page 43: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Consultas• Entity SQL▫ Dialecto SQL indep. de gestor con soporte para:

ObjectQuery<Blog> query = ctx.CreateQuery<Blog>("SELECT VALUE bp.Blogs FROM BlogPosts as bp WHERE bp.BlogDate > @date", Q p g p p Tipos enriquecidos, relaciones, herencia… Strings que se resuelven en tiempo de ejecución

i i

p g g p p gnew ObjectParameter("date",date));

• LINQ to Entities▫ Todas las ventajas de LINQ (tipado fuerte,

expresiones lambda)IQueryable<Blog> query = from posts in ctx.BlogPostsexpresiones lambda)▫ Lenguaje que se resuelve en tiempo de

compilación

IQueryable<Blog> query from posts in ctx.BlogPostswhere posts.BlogDate > dateselect posts.Blogs;

compilación▫ Aprovechamos el tipado fuerte, la inferencia y el

Intellisense de Visual Studio▫ Menos errores en ejecución

Page 44: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

LINQ To EntitiesLINQ To Entities• Diferencias con LINQ To Objects y To XMLDiferencias 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:• Cuando se enumeran los resultados:▫ query1.FirstOrDefault(), query1.ToList() …▫ Se ejecuta la consulta SQL y devuelve un Se ejecuta la consulta SQL y devuelve un

IEnumerable<T>• No están disponibles todos los operadores de Linq

bjTo Objects o To XML

Page 45: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Arquitectura de LINQ To Entities

Page 46: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Operadores disponiblesExpresió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/AGeneración N/A

Cuantificación Any(), All()

Elementos First(), Last(), ElementAt(). {método}OrDefault()

Agregados Count(), LongCount(), Max(), Min(), Sum(), Average()

Page 47: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Cómo hacer una consulta• Establecer el contexto▫ Using (FlightContext ctx = new FlightContext()) { …}g ( g g ()) { }

• Dentro del contexto construír la consulta▫ Obtener los IQueryable<T> del Contexto▫ IQueryable<Flight> query =

from f in ctx.Flightsh T “MAD”where p.To==“MAD”

select f;• Ejecutar la consulta• Ejecutar la consulta▫ Con un operador de conversión query ToList(); query FirstOrDefault() query.ToList(); query.FirstOrDefault() …

Page 48: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Otras consideraciones• Pensar la consulta con el modelo conceptual▫ Navegar por las relaciones y no con joins

bj d d d l• Los objetos recuperados dentro del contexto son gestionados por el ObjectStateManager (tracking)

• Cuando se cierra el contexto NO• 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;from f in ctx.Flights.Include( Aircraft ) select f;

▫ Carga explícita if (!aflight.Aircraft.IsLoaded)

fli ht Ai ft L d()aflight.Aircraft.Load();

Page 49: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Modelo ER

Page 50: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Modelo EF

Page 51: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Lenguaje Integrado de Consultas: LINQ

Page 52: Lenguaje Integrado de Consulta - SABIA-Group :: …sabia.tic.udc.es/.../docs/documentos/lenguajeintegradodeconsulta.pdf · • Novedades en C# 3 0Novedades en C# 3.0 • Fundamentos

Recursos• MSDN: http//Msdn microsoft com• 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 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 ▫ ADO.NET Entity Framework , Unai Zorrilla, Octavio

Hernández, Eduardo Quintás. Krasis Press 2008. ISBN: 978-84-935489-9-5