You are on page 1of 35

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…

2

LINQ par Jonathan Barbosa - Ingénieurs 2000 IR 3

Xposé 2010

Présentation

Multiplication des langages de
requêtes
Autres
langages

Son langage
SQL

Que doit
connaitre un
développeur ?
JQL, Entity
SQL, …

XML

XPath

3

LINQ par Jonathan Barbosa - Ingénieurs 2000 IR 3

Xposé 2010

Ingénieurs 2000 IR 3 Xposé 2010 .Présentation Pourquoi tant de langage ?!  Multiplication des sources de données :  Purs Objets (Collections)  Bases de données relationnelles  Entity Framework  XML  Autres fichiers structurés … 4 LINQ par Jonathan Barbosa .

. DataSet ds = new DataSet(). foreach (Customer c in GetCustomerList()) { if (c.City == "Paris" && c.Fill(ds)..CompanyName). //. MyAdapter. } }  BDD & DataSet // . units_in_stock.Présentation Anciennes Approches  Collections & boucles : List<string> parisian = new List<string>().Country = "France") { parisian.country='France'". (Fermeture de la base & traitement) 5 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .add(c.city='Paris' AND c... unit_price FROM Customers as c WHERE c. (overture de la base) SqlDataAdapter MyAdapter = new SqlDataAdapter("SELECT product_name. connection).

CreateNavigator().  XPath XPathDocument doc = new XPathDocument("customers.Where("it. foreach (XPathNavigator c in it) { parisian. new ObjectParameter("city".Add(c.Country = @country".xml").Présentation Anciennes approches (suite)  Entité ObjectQuery<Customers> customerQuery = context.Select("/customer[@city='Paris' and @country='France']"). "Paris"). XPathNavigator nav = doc. XPathNodeIterator it = nav.Ingénieurs 2000 IR 3 Xposé 2010 .Customer .City = @city AND it. new ObjectParameter("country".GetAttribute("companyName". } 6 LINQ par Jonathan Barbosa . "France")). "")).

Ingénieurs 2000 IR 3 Xposé 2010 .Présentation La solution LINQ 7 LINQ par Jonathan Barbosa .

5 (Anders Hejlsberg) A venir : PLINQ in parallel FX Library LINQ par Jonathan Barbosa .Présentation Petit historique  Plusieurs projets de recherches de Microsoft      8 Research join-calculus de Cédric Fournet (INRIA Roquencourt) Polyphonic C# par Nick Benton. Luca Cardelli et Cédric Fournet Intégration au projet C (c omega ou comega language) 19 novembre 2007 : LINQ dans le Framework 3.Ingénieurs 2000 IR 3 Xposé 2010 .

Une syntaxe familière… 9 LINQ par Jonathan Barbosa . new Customer() } where c.Ingénieurs 2000 IR 3 Xposé 2010 .CompanyName. boucle ? new Customer(). new Customer().Présentation Recherche dans une collection Le résultat fonctionne dans foreach !!! IEnumerable<string> parisian = from c in new Customer[] { Pas de new Customer().City == "Paris" && c.Country == "France" select c.

NET 3.5  Syntaxe proche de SQL  Approche objet intégrée  Concept « list comprehension »  Intégré à tous les états du code  Code Source  Code IL (Intermediate Language)  Runtime 10 LINQ par Jonathan Barbosa .Présentation LINQ ? Language-INtegrated Query  Langage de requêtes .Ingénieurs 2000 IR 3 Xposé 2010 .

du « sucre » syntaxique…  Améliore la productivité  Une phase de compilation supplémentaire  … raccourci vers des méthodes utilisables  Améliore la compréhension  Syntaxe plus lourde 11 LINQ par Jonathan Barbosa .Présentation LINQ : Comment ça marche ?  D’abord.Ingénieurs 2000 IR 3 Xposé 2010 .

Select(delegate(Customers c) { return new { c.CompanyName }.Where(delegate(Customers c) { return c.Ingénieurs 2000 IR 3 Xposé 2010 .CompanyName } .City == "Paris" && c. }).Présentation Code || Traduction var parisanCustomers = from c in customers where c.City == "Paris" && c.Country == "France" }) . var parisanCustomers = customers .Select(c => new { c. var parisanCustomers = customers . 12 LINQ par Jonathan Barbosa .Country == "France") .Where(c => c.Country == "France" select new { c.City == "Paris" && c.CompanyName }).

Sommaire  Présentation  Nouveaux concepts  Immersion dans le Framework  Commandes avancées et précautions  Pour conclure… 13 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .

Nouveaux concepts LINQ et son lot de nouveautés var parisanCustomers = customers .City == "Paris" && c. }).Select(delegate(Customers c) { return new { c. 14 LINQ par Jonathan Barbosa .CompanyName } .Country == "France") .Ingénieurs 2000 IR 3 Xposé 2010 .Where(c => c.

a) // Comment est ce possible.WriteLine(res. // "Paris" est de type string donc aString aussi  var res = from x select new {a. // res est de type IEnumerable<anonymous type>  Console. on ne connais pas le type ??? 15 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .Nouveaux concepts Inférence == Magie ?  Mécanisme d’auto typage  Uniquement sur les variables locales  Type : Evaluation de l’AST de l’expression  var aString = "Paris". b}.Current.

Ingénieurs 2000 IR 3 Xposé 2010 .Nouveaux concepts Type anonyme + Initialiseur d’objets  Ecrire rapidement une classe sans méthodes  Types Ad-Hoc :  new {[name1 =] expr1.  namen ne peut être typé  Inféré par le type de l’expression  Si name omis  Initialiseur d’objets  Génial pour imiter la projection SQL non ? 16 LINQ par Jonathan Barbosa . ….[namen =] exprn}.

Nouveaux concepts Méthodes d’extension  LINQ sur les tableaux c’est possible IEnumerable<string> parisian = new Customer[] { new Customer().Select(c => c. new Customer() }.Where(c => c.Country == "France") .CompanyName). new Customer().  Nouvelle méthodes sur le type Array ?  Trop complexe à intégrer  utilisation des méthodes d’extension 17 LINQ par Jonathan Barbosa .City == "Paris" && c. new Customer().Ingénieurs 2000 IR 3 Xposé 2010 .

Ingénieurs 2000 IR 3 Xposé 2010 . bool>> expr). bool> predicate). OU public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource>.  Pourquoi deux signatures pour Where ? 18 LINQ par Jonathan Barbosa . Expression<Func<TSource.Méthodes d’extension : Déclaration Nouveaux concepts  Greffer des méthodes sur une classe  Visibilité des membres publics uniquement  Une simple méthode static dans une classe public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> collection. Func<Tsource.

Ingénieurs 2000 IR 3 Xposé 2010 .CompanyName } .City == "Paris" && c.Select(delegate(Customer c) { return new { c.Where(c => c.  « SELECT * FROM customers » et on boucle en local ?  Collections  Oui  Données distantes  Inacceptable… 19 LINQ par Jonathan Barbosa .Nouveaux concepts Delegate vs Expression ?  Reprenons la requête : var parisanCustomers = customers . }).Country == "France") .

[Typen] argn ) => expression  Les types sont optionnels  Exemple : c => c.Ingénieurs 2000 IR 3 Xposé 2010 . [Type2] arg2.City == "Paris" && c.Nouveaux concepts Lambda expression  Récupérer des langages fonctionnels  Syntaxe simple ( [Type1] arg1.Country == "France"  Génère un arbre de l’expression  Ou un delegate  20 LINQ par Jonathan Barbosa . ….

Ingénieurs 2000 IR 3 Xposé 2010 .Delegate vs Expression : la réponse Nouveaux concepts  Signature  Dépend du LINQ provider  A la discrétion du développeur  Privilégier les performances  Expressions lambda : A toujours utiliser  Uniformiser le code  Choix de conversion (delegate || expression) automatique 21 LINQ par Jonathan Barbosa .

Sommaire  Présentation  Nouveaux concepts  Immersion dans le Framework  Commandes avancées et précautions  Pour conclure… 22 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .

NET  Représentation de l’arbre en runtime  Mémorise le type des données  Générer dynamiquement des requêtes de tout type (SQL.Ingénieurs 2000 IR 3 Xposé 2010 .Un arbre d’expressions ? Un AST ? Immersion dans le Framework  Une expression valide :  AST de l’expression  Existe à la compilation dans tous les langages  Disponible uniquement à la compilation…  … sauf en . XPath)  Parfait pour les expressions lambda 23 LINQ par Jonathan Barbosa .

Immersion dans le Framework Une requête dans le Framework 24 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .

Immersion dans le Framework Exécution d’une requête  Exemple : LINQ To Entities 25 LINQ 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… 26 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .

CompanyName.CompanyName. 27 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 … group c by c. Xposé 2010 .Commandes avancées et précautions Liste des clauses  Obligatoires  1ère From from c in customers …  Dernière Select ou Group by … select c.

property (ascending | descending)  Into (stockage intermédiaire)  0…n  select..Ingénieurs 2000 IR 3 Xposé 2010 .n en plus  Where (filtre)  1 where expression  Join (regroupement)  0…n join var in queryable on jointure_expression  OrderBy (trie)  0…n orderby var. group by et join  From intermédiaire into var  Et bien d’autre encore… 28 LINQ par Jonathan Barbosa ..Commandes avancées et précautions Liste des clauses  Facultatives  From  0.

Commandes avancées et précautions Les opérateurs (Aggregate)  Opération sur un (sous-)ensemble de données  Avec sélecteur de champs     Count Sum Min/Max Average  Avec comparateur     29 Distinct Union Exept Intersect LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .

 Problème  2 boucles  Select  Sum()  Solution : Le sélecteur de la méthode Sum() int totalStock = products.Sum().NET et LINQ to XML 30 LINQ par Jonathan Barbosa .Ingénieurs 2000 IR 3 Xposé 2010 .Sources d’erreurs : LINQ to Object Commandes avancées et précautions  Simple somme en LINQ int totalStock = (from p in products select p.  Requête optimisée avec LINQ to ADO.UnitsInStock).Sum(p => p.UnitsInStock).

Ingénieurs 2000 IR 3 Xposé 2010 .Sommaire  Présentation  Nouveaux concepts  Immersion dans le Framework  Commandes avancées et précautions  Pour conclure… 31 LINQ par Jonathan Barbosa .

Pour conclure… LINQ to …  ADO. Ingres. PostgreSQL.NET Data Services  Oracle. SQLite.Ingénieurs 2000 IR 3 Xposé 2010 .        32 Microsoft SQL Server Entities (Entity Framework) System Search (Windows Search) Google (Search) NHibernate CSV Twitter … LINQ par Jonathan Barbosa . MySQL.

Ingénieurs 2000 IR 3 Xposé 2010 .Pour conclure… Autres implémentation  Javascript :  jLinq  JSINQ  LINQ to JavaScript  PHPLinq  Java :  Quaere  JaQue  JaQu  Querydsl 33 LINQ par Jonathan Barbosa .

cs.microsoft.pdf  MSDN LINQ Home page: http://msdn.php?blog=121& title=linq_attention_a_bien_l_utiliser  Liste des LINQ providers : http://en.org/wiki/Language_Integrated_ LINQ par Jonathan Barbosa .Pour conclure Références  Excellent cours en anglais sur LINQ : 34 http://webcourse.com/index.wikipedia.com/enus/library/bb308961.Ingénieurs 2000 Query Xposé 2010 IR 3 .ac.il/234319/Spring2 009/ho/WCFiles/09%20LINQ.aspx  LINQ « attention à bien l’utiliser » : http://blog.developpez.technion.

Merci de votre attention ! Question ? .