linq : language-integrated query

Click here to load reader

Upload: duena

Post on 07-Jan-2016

34 views

Category:

Documents


3 download

DESCRIPTION

LINQ : Language-INtegrated Query. Par Jonathan Barbosa Ingénieurs 2000 – IR 3 Xposé 2010. Sommaire. Présentation Nouveaux concepts Immersion dans le Framework Commandes avancées et précautions Pour conclure…. Présentation. Multiplication des langages de requêtes. Présentation. - PowerPoint PPT Presentation

TRANSCRIPT

LINQ : Language-INtegrated Query

Par Jonathan BarbosaIngnieurs 2000 IR 3Xpos 2010LINQ : Language-INtegrated QuerySommaireXpos 2010LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 32PrsentationNouveaux conceptsImmersion dans le FrameworkCommandes avances et prcautionsPour conclure2Multiplication des langages de requtesLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Xpos 20103PrsentationPourquoi tant de langage ?!LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Multiplication des sources de donnes :Purs Objets (Collections)Bases de donnes relationnellesEntity FrameworkXMLAutres fichiers structursXpos 20104PrsentationAnciennes ApprochesLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Collections & boucles :

BDD & DataSet

List parisian = new List();foreach (Customer c in GetCustomerList()) { if (c.City == "Paris" && c.Country = "France") { parisian.add(c.CompanyName); }}// ... (overture de la base)SqlDataAdapter MyAdapter = new SqlDataAdapter("SELECT product_name, units_in_stock, unit_price FROM Customers as c WHERE c.city='Paris' AND c.country='France'", connection);DataSet ds = new DataSet();MyAdapter.Fill(ds);//... (Fermeture de la base & traitement)Xpos 20105PrsentationAnciennes approches (suite)LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Entit

XPath

ObjectQuery customerQuery = context.Customer .Where("it.City = @city AND it.Country = @country", new ObjectParameter("city", "Paris"), new ObjectParameter("country", "France"));XPathDocument doc = new XPathDocument("customers.xml");XPathNavigator nav = doc.CreateNavigator();XPathNodeIterator it = nav.Select("/customer[@city='Paris' and @country='France']");foreach (XPathNavigator c in it) { parisian.Add(c.GetAttribute("companyName", ""));}Xpos 20106PrsentationLa solution LINQLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3

Xpos 20107PrsentationPetit historiqueLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Plusieurs projets de recherches de Microsoft Researchjoin-calculus de Cdric Fournet (INRIA Roquencourt)Polyphonic C# par Nick Benton, Luca Cardelli et Cdric FournetIntgration au projet C (c omega ou comega language)19 novembre 2007 : LINQ dans le Framework 3.5 (Anders Hejlsberg)A venir : PLINQ in parallel FX LibraryXpos 20108PrsentationJoin-calculus : langage de programmation distribuPolyphonic C# : Intgration dans C# de join-calculusCw ( X# ou Xen) : Ide rendre laccs au magasin de donnes (BDD ou XML) aussi facile que les types primitifsPLINQ : excution de requtes distribue mutli-core, mutli-proc

8Recherche dans une collectionLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3IEnumerable parisian = from c in new Customer[] { new Customer(), new Customer(), new Customer(), new Customer() } where c.City == "Paris" && c.Country == "France" select c.CompanyName;Pas de boucle ?Le rsultat fonctionne dans foreach !!!Xpos 20109Une syntaxe familirePrsentationLINQ ? Language-INtegrated QueryLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Langage de requtes .NET 3.5Syntaxe proche de SQLApproche objet intgreConcept list comprehension Intgr tous les tats du codeCode SourceCode IL (Intermediate Language)RuntimeXpos 201010PrsentationLINQ : Comment a marche ?LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Dabord, du sucre syntaxiqueAmliore la productivitUne phase de compilation supplmentaire raccourci vers des mthodes utilisablesAmliore la comprhensionSyntaxe plus lourdeXpos 201011PrsentationCode || TraductionLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3var parisanCustomers = customers .Where(c => c.City == "Paris" && c.Country == "France") .Select(c => new { c.CompanyName });var parisanCustomers = from c in customers where c.City == "Paris" && c.Country == "France" select new { c.CompanyName };var parisanCustomers = customers .Where(delegate(Customers c) { return c.City == "Paris" && c.Country == "France" }) .Select(delegate(Customers c) { return new { c.CompanyName } ; });Xpos 201012PrsentationSommaireXpos 2010LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 313PrsentationNouveaux conceptsImmersion dans le FrameworkCommandes avances et prcautionsPour conclure13LINQ et son lot de nouveautsLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3var parisanCustomers = customers .Where(c => c.City == "Paris" && c.Country == "France") .Select(delegate(Customers c) { return new { c.CompanyName } ; });Infrence de typeMthode dextensionType anonymeInitialiseur dobjetExpression LambdaXpos 201014Nouveaux conceptsInfrence : Le compilateur value lexpression afin de dterminer le type de la variableMthode dextension : mthode static avec une syntaxe particulire this Object oType anonyme et Initialiseur dobjet : Gnre une classe sans nom mais fortement typ (infrence) qui possde automatiquement les accesseurs au champs crer par linitialiseur dobjet14Infrence == Magie ?LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Mcanisme dauto typageUniquement sur les variables localesType : Evaluation de lAST de lexpression

var aString = "Paris"; // "Paris" est de type string donc aString aussi

var res = from x select new {a, b}; // res est de type IEnumerable

Console.WriteLine(res.Current.a)// Comment est ce possible, on ne connais pas le type ???

Xpos 201015Nouveaux conceptsType anonyme + Initialiseur dobjetsLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Ecrire rapidement une classe sans mthodesTypes Ad-Hoc :

new {[name1 =] expr1, ,[namen =] exprn};

namen ne peut tre typ Infr par le type de lexpressionSi name omis Initialiseur dobjetsGnial pour imiter la projection SQL non ?Xpos 201016Nouveaux conceptsMthodes dextensionLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3LINQ sur les tableaux cest possible

Nouvelle mthodes sur le type Array ?Trop complexe intgrer utilisation des mthodes dextensionIEnumerable parisian = new Customer[] { new Customer(), new Customer(), new Customer(), new Customer()}.Where(c => c.City == "Paris" && c.Country == "France").Select(c => c.CompanyName);Xpos 201017Nouveaux conceptsMthodes dextension : Dclaration LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Greffer des mthodes sur une classeVisibilit des membres publics uniquementUne simple mthode static dans une classe

Pourquoi deux signatures pour Where ?

public static IEnumerable Where(this IEnumerable collection, Func predicate);public static IEnumerable Where(this IEnumerable, Expression expr);OUXpos 201018Nouveaux conceptsDelegate vs Expression ?LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Reprenons la requte :

SELECT * FROM customers et on boucle en local ?Collections OuiDonnes distantes Inacceptablevar parisanCustomers = customers .Where(c => c.City == "Paris" && c.Country == "France") .Select(delegate(Customer c) { return new { c.CompanyName } ; });Xpos 201019Nouveaux conceptsLambda expressionLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Rcuprer des langages fonctionnelsSyntaxe simple

( [Type1] arg1, [Type2] arg2, , [Typen] argn ) => expression

Les types sont optionnels Exemple :

Gnre un arbre de lexpressionOu un delegate

c => c.City == "Paris" && c.Country == "France"Xpos 201020Nouveaux conceptsDelegate vs Expression : la rponseLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Signature Dpend du LINQ providerA la discrtion du dveloppeurPrivilgier les performances

Expressions lambda : A toujours utiliserUniformiser le codeChoix de conversion (delegate || expression) automatique

Xpos 201021Nouveaux conceptsSommaireXpos 2010LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 322PrsentationNouveaux conceptsImmersion dans le FrameworkCommandes avances et prcautionsPour conclure

22Un arbre dexpressions ? Un AST ?LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Une expression valide :AST de lexpressionExiste la compilation dans tous les langagesDisponible uniquement la compilation sauf en .NETReprsentation de larbre en runtimeMmorise le type des donnesGnrer dynamiquement des requtes de tout type (SQL, XPath)Parfait pour les expressions lambda

Xpos 201023Immersion dans le FrameworkUne requte dans le FrameworkLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Xpos 201024Immersion dans le Framework

Excution dune requteLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Exemple : LINQ To EntitiesXpos 201025

Immersion dans le FrameworkADO : ActiveX Data ObjectsEDM : Entity Data Model25SommaireXpos 2010LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 326PrsentationNouveaux conceptsImmersion dans le FrameworkCommandes avances et prcautionsPour conclure

26Liste des clausesLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Obligatoires1re From

Dernire Select ou Group by

from c in customers Elment courant de litrateurCollections requter select c.CompanyName;Choix des valeurs slectionnsRetourne une collection paramtr par le type slectionn group c by c.CompanyName;Xpos 201027Commandes avances et prcautionsListe des clausesLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3FacultativesFrom 0...n en plusWhere (filtre) 1where expressionJoin (regroupement) 0njoin var in queryable on jointure_expressionOrderBy (trie) 0norderby var.property (ascending | descending)Into (stockage intermdiaire) 0n select, group by et joinFrom intermdiaireinto varEt bien dautre encoreXpos 201028Commandes avances et prcautionsLes oprateurs (Aggregate)LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Opration sur un (sous-)ensemble de donnesAvec slecteur de champsCountSumMin/MaxAverageAvec comparateurDistinctUnionExeptIntersect

Xpos 201029Commandes avances et prcautionsSources derreurs : LINQ to ObjectLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Simple somme en LINQ

Problme 2 bouclesSelectSum()Solution : Le slecteur de la mthode Sum()

Requte optimise avec LINQ to ADO.NET et LINQ to XML

int totalStock = (from p in products select p.UnitsInStock).Sum();int totalStock = products.Sum(p => p.UnitsInStock);Xpos 201030Commandes avances et prcautionsSommaireXpos 2010LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 331PrsentationNouveaux conceptsImmersion dans le FrameworkCommandes avances et prcautionsPour conclure

31LINQ to LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3ADO.NET Data ServicesOracle, MySQL, PostgreSQL, SQLite, Ingres, Microsoft SQL ServerEntities (Entity Framework)System Search (Windows Search)Google (Search)NHibernateCSVTwitter

Xpos 201032Pour conclureAutres implmentationXpos 2010LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 333Javascript :jLinqJSINQLINQ to JavaScriptPHPLinqJava :QuaereJaQueJaQuQuerydslPour conclureRfrencesLINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3Excellent cours en anglais sur LINQ : http://webcourse.cs.technion.ac.il/234319/Spring2009/ho/WCFiles/09%20LINQ.pdfMSDN LINQ Home page: http://msdn.microsoft.com/en-us/library/bb308961.aspxLINQ attention bien lutiliser : http://blog.developpez.com/index.php?blog=121&title=linq_attention_a_bien_l_utiliserListe des LINQ providers : http://en.wikipedia.org/wiki/Language_Integrated_Query

Xpos 201034Pour conclureMerci de votre attention !Question ?