Lenguaje Integrado de Consulta - SABIA-Group ::...
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/1.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/2.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/3.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/4.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/5.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/6.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/7.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/8.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/9.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/10.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/11.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/12.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/13.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/14.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/15.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/16.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/17.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/18.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/19.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/20.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/21.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/22.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/23.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/24.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/25.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/26.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/27.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/28.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/29.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/30.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/31.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/32.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/33.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/34.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/35.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/36.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/37.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/38.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/39.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/40.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/41.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/42.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/43.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/44.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/45.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/46.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/47.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/48.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/49.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/50.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/51.jpg)
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](https://reader031.fdocuments.in/reader031/viewer/2022013016/5bb6171809d3f250788e176b/html5/thumbnails/52.jpg)
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