Eduardo Quintás. Guía Novedades en C# 3.0 Fundamentos de LINQ Linq To Objects Linq To XML Linq To Entities Recursos

  • View
    225

  • Download
    0

Embed Size (px)

Text of Eduardo Quintás. Guía Novedades en C# 3.0 Fundamentos de LINQ Linq To Objects Linq To XML Linq To...

Lenguaje Integrado de consultasLINQEduardo Quints1GuaNovedades en C# 3.0Fundamentos de LINQLinq To ObjectsLinq To XMLLinq To EntitiesRecursosNovedades en C#3.0Lenguaje Integrado de Consultas: LINQEvolucin de .NET200220032005200620072010Herramienta(Visual Studio)VS 2002VS 2003VS2005VS2005+ ExtensionesVS2008VS2010LenguajeC# v1.0VB.NET (v7.0)C# v1.1VB.NET (v7.1)C# v2.0VB2005 (v8.0)como antesC# v3.0VB9(v9.0)C# 4.0VB10(v10.0)Libreras FrameworkNetFx v1.0NetFx v1.1NetFx v2.0NetFx v3.0NetFx v3.5NetFxV4.0Engine (CLR)CLR v1.0CLR v1.1CLR v2.0como antescomo antesCLR v4.0C# 3.0 - ObjetivosIntegrar objetos, datos relacionales y XMLY:Hacer el lenguaje ms concisoAadir constructores de programacin funcionalNo ligar el lenguaje a APIs especficasMantenerse 100% compatible hacia atrs

5Resultado: Mtodos extensores, tipos annimos, constructores sin parmetros, inferencia de tipos, expresiones lambda, rboles de expresin

Ms un poquito de azucar sintctico

from p in Passengerswhere p.Citizenship == ESselect new { p.Id, p.Name };Nuevas caractersticasInicializadores de objetosInferencia de tiposTipos annimosMtodos extensoresExpresiones lambdarboles de expresinLINQ!!!Inicializadores de Objetospublic class Passenger{ public string Id {get; set;} public string Name {get; set;} public DateTime BirthDate {get; set;}}Passenger p = new Passenger () { Id = A4, Name = Cabezabolo, Manolo };Passenger p = new Passenger();p.Id = A4;p.Name = Cabezabolo, Manolo;Asignacin de Campos o Propiedadespublic Passenger(string id, string name, DateTime birthDate) // OPCIONAL!!!!{ Id=id; Name=name; BirthDate = birthDate; }8Inferencia de Tiposint i = 666;string s = Hola";double d = 3.14;int[] numbers = new int[] {1, 2, 3};Dictionary pedidos = new Dictionary();var i = 666;var s = Hola";var d = 3.14;var numbers = new int[] {1, 2, 3};var pedidos = new Dictionary();El tipo en el lado de la derecha9Tipos Annimosvar o = new { Name = Pantoja, Age= 75 };class XXX{ public string Name; public int Age;}XXXMtodos Extensoresnamespace MisCosas{ public static class Extensiones { public static string Concatenar(this IEnumerable strings, string separador) {} }}using MisCosas;string[] nombres = new string[] { Edu", Juan", Manolo" };string s = nombres.Concatenar(", ");Mtodo extensorIncluir extensiones en el mbitoobj.Foo(x, y)XXX.Foo(obj, x, y)IntelliSense!11Expresiones Lambdapublic delegate bool Predicate(T obj);

public class List{ public List FindAll(Predicate test) { List result = new List(); foreach (T item in this) if (test(item)) result.Add(item); return result; } }Delegado genricoTipogenrico12Expresiones Lambdapublic class MiClase{ public static void Main() { List clientes = ObtenerListaClientes(); List locales = clientes.FindAll( new Predicate(CiudadIgualCoruna) ); }

static bool CiudadIgualCoruna(Cliente c) { return c.Ciudad == A Corua"; }}13Expresiones Lambdapublic class MiClase{ public static void Main() { List clientes = ObtenerListaClientes (); List locales = clientes.FindAll( delegate(Cliente c) { return c.Ciudad == A Corua"; } ); }}DelegadoAnnimo14Expresiones Lambdapublic class MiClase{ public static void Main() { List clientes = ObtenerListaClientes (); List locales = clientes.FindAll( (Clientes c) => {return c.Ciudad == A Corua";} ); }}ExpresinLambda15Expresiones Lambdapublic class MiClase{ public static void Main() { List clientes = ObtenerListaClientes (); List locales = clientes.FindAll(c => c.Ciudad == A Corua"); }}ExpresinLambda16Introduciendo LINQTodos estos nuevos aspectos se trasladan a mtodos extensores sobre colecciones:Pueden transformarse en rboles de expresionesfrom p in passengerswhere p.Citizenship== ES"select new { p.Id, p.Name };passengers.Where(p => c.Citizenship == ES").Select(p => new { p.Id, p.Name });17var pasajerosNacionales = from p in passengers where p.Citizenship == ES" select new {p.Id, p.Name};var pasajerosNacionales = passengers .Where(p => p.Citizenship== ES") .Select(p => new { p.Id, p.Name});Mtodos ExtensoresExpresionesLambdaExpresiones de ConsultaInicializadores de ObjetosTipos AnnimosInferencia Tipos Variables LocalesIntroduciendo LINQ18Fundamentos de LINQLenguaje Integrado de Consultas: LINQLINQ: Lenguage Integrated QueryLenguaje de consulta universal de primer orden en C# y VB9Reducir el conocimiento de distintas formas de consulta.Parecido a lo que ya conocemos : SQLBasado en Lambda Clculo, Tipado fuerte, Ejecucin retrasada (deferred) Utiliza caractersticas nuevas del lenguaje como: Inferencia de tipos, Tipos annimos, Mtodos extensores y Inicializacin de objetosAltamente extensibleMltiples proveedoresObjects, XML, DataSets, SQL, EntitiesWMI, Sharepoint, Excel incluso para Google, Flickr, AmazonLanguage INtegrated Query (LINQ)LINQ enabled data sources

LINQTo ObjectsObjects

LINQTo XML

XMLLINQ enabled ADO.NET

LINQTo DataSets

LINQTo SQL

LINQTo EntitiesRelational

Others

VB

C#

.NET Language-Integrated Query21Arquitectura de LINQSystem.Linq.EnumerableBasado en delegadosFuente implementaIEnumerablevar query = from p in passengers where p.Citizenship== ES" select pSystem.Linq.QueryableBasado en rbol de expresinFuente implementaIQueryableSQLDataSetsObjetosEntitiesXMLExpresin de Consulta from id in source{ from id in source | join id in source on expr equals expr [ into id ] | let id = expr | where condition | orderby ordering, ordering, } select expr | group expr by key[ into id query ]Empieza con fromCero o ms from, join, let, where, o orderbyTermina conselect o group byContinuacin into opcional23Expresiones de ConsultaProyeccinSelect FiltradoWhere , DistinctComprobacinAny(), All()Union Join On Equals Agrupacin Group By , Into , Group Join On Equals Into AgregacinCount(), Sum(), Min(), Max(), Avg()ParticinSkip [ While ] , Take [ While ] ConjuntoUnion, Intersect, ExceptOrdenacinOrder By , [ Ascending | Descending ] 4/26/2010 10:10 AM24 2005 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.Group Join is essentially Left outer join for hierarchical data

Operadores de ConsultaExpresin de consulta de LinqWhere(), Select(), SelecMany(), OrderBy(), ThenBy(), OrderByDescending(), ThenByDescending(), GroupBy(), Join(), GroupJoin()ParticinTake(), Skip(), TakeWhile(), SkipWhile()ConjuntoDistinct(), Union(), Intersect(), Except()ConversinToArray(), ToList(), ToDictionary(), ToLookup(), AsEnumerable(), Cast(), OfType()GeneracinRange(), Repeat(), Empty(), Concat(), Reverse()CuantificacinAny(), All(), Contains(), SequenceEqual()ElementosFirst(), Last(), Single(), ElementAt(), DefaultIfEmpty(). {mtodo}OrDefault()AgregadosCount(), LongCount(), Max(), Min(), Sum(), Average(), Aggregate()4/26/2010 10:10 AM25 2005 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.Group Join is essentially Left outer join for hierarchical data

LINQ to ObjectsLenguaje Integrado de Consultas: LINQLINQ To ObjectsAplicable en colecciones genricas y arrays que estn en memoria (heap)Mtodos extensores para colecicones y arraysUsing System.Linq;Las expresiones de consulta devuelven IEnumerableFundamental para gestionarlas de modo flexible Ejemplos de consultas

4/26/2010 10:10 AM28 2005 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.Group Join is essentially Left outer join for hierarchical data

LINQ to XMLLenguaje Integrado de Consultas: LINQXML en .Net FrameworkClases XmlTextReader y XmlTextWriterL/E secuencial: Eficiente pero complejoSerializacin y Deserializacin: System.Xml.SerializationAtributos en clases, S/D contra streams (ficheros, memoria)Clases XmlDocument, XmlNode en System.XmlImplementan un DOM por rbolesAhora: LINQ To XMLExtensin de LINQ de .NetSimple, Flexible, Potente, nuevo DOM.Manipulacin y consulta con LINQLINQ To XMLImportando System.Xml.LinqNuevo DOM: Construccin funcional: XElementIndependencia del documentoPermite crear fragmentos XML sin asociarlos a un XDocumentTexto como valorHojas del rbol XML se convierten a tipos por valor de .Net

Clase XElement.Load() / .Save()Cargan o Guardan de un stream un documento XML.Elements()Secuencia de elementos contenidos.ElementsBeforeSelf(), .ElementsAfterSelf()Elementos hermanos anteriores o posteriores en el mismo nivel del rbol.Descendants{AndSelf}()Secuencia aplanada de todos los elementos hijos.Ancestors{AndSelf}()Secuencia aplanada de todos los elementos padres.Attributes()Atributos del elementoLos mtodos estn sobrecargados para localizar elementos concretos.Mtodos ms representativosCreacin de documentosDirectamente 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");Consult