Lenguaje Integrado de Consulta - SABIA-Group ::...
Transcript of Lenguaje Integrado de Consulta - SABIA-Group ::...
Eduardo Quintás
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
Lenguaje Integrado de Consultas: LINQ
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
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
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 };};
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!!!
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”;
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”
Tipos Anónimosclass XXX{
public string Name;bli i t Apublic int Age;
}
XXX
var o = new { Name = “Pantoja”, Age= 75 };
XXX
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!
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;}…
}}
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";
}}
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
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
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
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 });
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
Lenguaje Integrado de Consultas: LINQ
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
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
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
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
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 ]
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()
Lenguaje Integrado de Consultas: LINQ
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
Ejemplos de consultas
Lenguaje Integrado de Consultas: LINQ
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
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
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
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");
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
};};
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");
LINQ to Entities• Arquitectura Entitiy Framework (EF)• Arquitectura Entitiy Framework (EF)• LINQ to Entities• Ejemplos• Ejemplos
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
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" />
...}
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
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
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.
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
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
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
Arquitectura de LINQ To Entities
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()
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() …
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();
Modelo ER
Modelo EF
Lenguaje Integrado de Consultas: LINQ
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