par jonathan barbosa ingénieurs 2000 – ir 3 xposé 2010 linq : language-integrated query

Click here to load reader

Upload: fiacre-faivre

Post on 04-Apr-2015

109 views

Category:

Documents


6 download

TRANSCRIPT

  • Page 1
  • Par Jonathan Barbosa Ingnieurs 2000 IR 3 Xpos 2010 LINQ : Language-INtegrated Query
  • Page 2
  • Sommaire Xpos 2010 LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 2 Prsentation Nouveaux concepts Immersion dans le Framework Commandes avances et prcautions Pour conclure
  • Page 3
  • Multiplication des langages de requtes LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Que doit connaitre un dveloppeur ? Autres langages SQL XML XPath JQL, Entity SQL, Son langage Xpos 2010 3 Prsentation
  • Page 4
  • Pourquoi tant de langage ?! LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Multiplication des sources de donnes : Purs Objets (Collections) Bases de donnes relationnelles Entity Framework XML Autres fichiers structurs Xpos 2010 4 Prsentation
  • Page 5
  • Anciennes Approches LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Collections & 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 2010 5 Prsentation
  • Page 6
  • Anciennes approches (suite) LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Entit 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 2010 6 Prsentation
  • Page 7
  • La solution LINQ LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Xpos 2010 7 Prsentation
  • Page 8
  • Petit historique LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Plusieurs projets de recherches de Microsoft Research join-calculus de Cdric Fournet (INRIA Roquencourt) Polyphonic C# par Nick Benton, Luca Cardelli et Cdric Fournet Intgration 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 Library Xpos 2010 8 Prsentation
  • Page 9
  • Recherche dans une collection LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 IEnumerable parisian = from c in 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 2010 9 Une syntaxe familire Prsentation
  • Page 10
  • LINQ ? Language-INtegrated Query LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Langage de requtes.NET 3.5 Syntaxe proche de SQL Approche objet intgre Concept list comprehension Intgr tous les tats du code Code Source Code IL (Intermediate Language) Runtime Xpos 2010 10 Prsentation
  • Page 11
  • LINQ : Comment a marche ? LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Dabord, du sucre syntaxique Amliore la productivit Une phase de compilation supplmentaire raccourci vers des mthodes utilisables Amliore la comprhension Syntaxe plus lourde Xpos 2010 11 Prsentation
  • Page 12 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 2010 12 Prsentation"> c.City == "Paris" && c.Country == "F">
  • Code || Traduction LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 var 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 2010 12 Prsentation
  • Page 13
  • Sommaire Xpos 2010 LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 13 Prsentation Nouveaux concepts Immersion dans le Framework Commandes avances et prcautions Pour conclure
  • Page 14 c.City == "Paris" && c.Co">
  • LINQ et son lot de nouveauts LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 var parisanCustomers = customers.Where(c => c.City == "Paris" && c.Country == "France").Select(delegate(Customers c) { return new { c.CompanyName } ; }); Xpos 2010 14 Nouveaux concepts
  • Page 15
  • Infrence == Magie ? LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Mcanisme dauto typage Uniquement sur les variables locales Type : 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 2010 15 Nouveaux concepts
  • Page 16
  • Type anonyme + Initialiseur dobjets LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Ecrire rapidement une classe sans mthodes Types Ad-Hoc : new {[name 1 =] expr 1, ,[name n =] expr n }; name n ne peut tre typ Infr par le type de lexpression Si name omis Initialiseur dobjets Gnial pour imiter la projection SQL non ? Xpos 2010 16 Nouveaux concepts
  • Page 17 c.CompanyName); Xpos 2010 17 Nouveaux concepts">
  • Mthodes dextension LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 LINQ sur les tableaux cest possible Nouvelle mthodes sur le type Array ? Trop complexe intgrer utilisation des mthodes dextension IEnumerable parisian = new Customer[] { new Customer(), new Customer() }.Where(c => c.City == "Paris" && c.Country == "France").Select(c => c.CompanyName); Xpos 2010 17 Nouveaux concepts
  • Page 18
  • Mthodes dextension : Dclaration LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Greffer des mthodes sur une classe Visibilit des membres publics uniquement Une 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); OU Xpos 2010 18 Nouveaux concepts
  • Page 19
  • Delegate vs Expression ? LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Reprenons la requte : SELECT * FROM customers et on boucle en local ? Collections Oui Donnes distantes Inacceptable var parisanCustomers = customers.Where(c => c.City == "Paris" && c.Country == "France").Select(delegate(Customer c) { return new { c.CompanyName } ; }); Xpos 2010 19 Nouveaux concepts
  • Page 20
  • Lambda expression LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Rcuprer des langages fonctionnels Syntaxe simple ( [Type 1 ] arg 1, [Type 2 ] arg 2, , [Type n ] arg n ) => expression Les types sont optionnels Exemple : Gnre un arbre de lexpression Ou un delegate c => c.City == "Paris" && c.Country == "France" Xpos 2010 20 Nouveaux concepts
  • Page 21
  • Delegate vs Expression : la rponse LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Signature Dpend du LINQ provider A la discrtion du dveloppeur Privilgier les performances Expressions lambda : A toujours utiliser Uniformiser le code Choix de conversion (delegate || expression) automatique Xpos 2010 21 Nouveaux concepts
  • Page 22
  • Sommaire Xpos 2010 LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 22 Prsentation Nouveaux concepts Immersion dans le Framework Commandes avances et prcautions Pour conclure
  • Page 23
  • Un arbre dexpressions ? Un AST ? LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Une expression valide : AST de lexpression Existe la compilation dans tous les langages Disponible uniquement la compilation sauf en.NET Reprsentation de larbre en runtime Mmorise le type des donnes Gnrer dynamiquement des requtes de tout type (SQL, XPath) Parfait pour les expressions lambda Xpos 2010 23 Immersion dans le Framework
  • Page 24
  • Une requte dans le Framework LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Xpos 2010 24 Immersion dans le Framework
  • Page 25
  • Excution dune requte LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Exemple : LINQ To Entities Xpos 2010 25 Immersion dans le Framework
  • Page 26
  • Sommaire Xpos 2010 LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 26 Prsentation Nouveaux concepts Immersion dans le Framework Commandes avances et prcautions Pour conclure
  • Page 27
  • Liste des clauses LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Obligatoires 1 re From Dernire Select ou Group by from c in customers select c.CompanyName; group c by c.CompanyName; Xpos 2010 27 Commandes avances et prcautions
  • Page 28
  • Liste des clauses LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Facultatives From 0...n en plus Where (filtre) 1 where expression Join (regroupement) 0n join var in queryable on jointure_expression OrderBy (trie) 0n orderby var.property (ascending | descending) Into (stockage intermdiaire) 0n select, group by et join From intermdiaire into var Et bien dautre encore Xpos 2010 28 Commandes avances et prcautions
  • Page 29
  • Les oprateurs (Aggregate) LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Opration sur un (sous-)ensemble de donnes Avec slecteur de champs Count Sum Min/Max Average Avec comparateur Distinct Union Exept Intersect Xpos 2010 29 Commandes avances et prcautions
  • Page 30
  • Sources derreurs : LINQ to Object LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Simple somme en LINQ Problme 2 boucles Select Sum() 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 2010 30 Commandes avances et prcautions
  • Page 31
  • Sommaire Xpos 2010 LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 31 Prsentation Nouveaux concepts Immersion dans le Framework Commandes avances et prcautions Pour conclure
  • Page 32
  • LINQ to LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 ADO.NET Data Services Oracle, MySQL, PostgreSQL, SQLite, Ingres, Microsoft SQL Server Entities (Entity Framework) System Search (Windows Search) Google (Search) NHibernate CSV Twitter Xpos 2010 32 Pour conclure
  • Page 33
  • Autres implmentation Xpos 2010 LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 33 Javascript : jLinq JSINQ LINQ to JavaScript PHPLinq Java : Quaere JaQue JaQu Querydsl Pour conclure
  • Page 34
  • Rfrences LINQ par Jonathan Barbosa - Ingnieurs 2000 - IR 3 Excellent cours en anglais sur LINQ : http://webcourse.cs.technion.ac.il/234319/Spring2009/ho /WCFiles/09%20LINQ.pdf http://webcourse.cs.technion.ac.il/234319/Spring2009/ho /WCFiles/09%20LINQ.pdf MSDN LINQ Home page: http://msdn.microsoft.com/en- us/library/bb308961.aspxhttp://msdn.microsoft.com/en- us/library/bb308961.aspx LINQ attention bien lutiliser : http://blog.developpez.com/index.php?blog=121&title=lin q_attention_a_bien_l_utiliser http://blog.developpez.com/index.php?blog=121&title=lin q_attention_a_bien_l_utiliser Liste des LINQ providers : http://en.wikipedia.org/wiki/Language_Integrated_Query http://en.wikipedia.org/wiki/Language_Integrated_Query Xpos 2010 34 Pour conclure
  • Page 35
  • Merci de votre attention ! Question ?