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
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