Vous êtes sur la page 1sur 35

LINQ : Language-INtegrated Query

Par Jonathan Barbosa


Ingnieurs 2000 IR 3
Xpos 2010

Sommaire
Prsentation

Nouveaux concepts
Immersion dans le Framework
Commandes avances et prcautions
Pour conclure

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

Multiplication des langages de


requtes
Autres
langages

Son langage
SQL

Que doit
connaitre un
dveloppeur ?
JQL, Entity
SQL,

XML

XPath

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

Pourquoi tant de langage ?!


Multiplication des sources de donnes :
Purs Objets (Collections)
Bases de donnes relationnelles
Entity Framework
XML

Autres fichiers structurs

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

Anciennes Approches
Collections & boucles :
List<string> parisian = new List<string>();
foreach (Customer c in GetCustomerList()) {
if (c.City == "Paris" && c.Country = "France") {
parisian.add(c.CompanyName);
}
}

BDD & DataSet


// ... (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)
5

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

Anciennes approches (suite)


Entit
ObjectQuery<Customers> customerQuery = context.Customer
.Where("it.City = @city AND it.Country = @country",
new ObjectParameter("city", "Paris"),
new ObjectParameter("country", "France"));

XPath
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", ""));
}
6

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

La solution LINQ

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

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

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

Recherche dans une collection


Le rsultat
fonctionne dans
foreach !!!
IEnumerable<string> parisian =
from c in new Customer[] {
Pas de
new Customer(),
boucle ?
new Customer(),
new Customer(),
new Customer()
}
where c.City == "Paris" && c.Country == "France"
select c.CompanyName;
Une syntaxe
familire
9

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation
LINQ
? Language-INtegrated
Query

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

10

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

LINQ : Comment a marche ?


Dabord, du sucre syntaxique
Amliore la productivit
Une phase de compilation supplmentaire

raccourci vers des mthodes utilisables


Amliore la comprhension
Syntaxe plus lourde

11

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Prsentation

Code || Traduction
var parisanCustomers =
from c in customers
where c.City == "Paris" && c.Country == "France"
select new { c.CompanyName };

var parisanCustomers = customers


.Where(c => c.City == "Paris" && c.Country == "France")
.Select(c => 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 } ;
});
12

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Sommaire
Prsentation

Nouveaux concepts
Immersion dans le Framework
Commandes avances et prcautions
Pour conclure

13

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Nouveaux concepts

LINQ et son lot de nouveauts


var parisanCustomers =
customers
.Where(c => c.City == "Paris" && c.Country == "France")
.Select(delegate(Customers c) {
return new { c.CompanyName } ;
});

14

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Nouveaux concepts

Infrence == Magie ?
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<anonymous type>


Console.WriteLine(res.Current.a)

// Comment est ce possible, on ne connais pas le type


???

15

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Nouveaux concepts

Type anonyme + Initialiseur dobjets


Ecrire rapidement une classe sans mthodes

Types Ad-Hoc :
new {[name1 =] expr1, ,[namen =] exprn};

namen ne peut tre typ Infr par le type de

lexpression
Si name omis Initialiseur dobjets
Gnial pour imiter la projection SQL non ?

16

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Nouveaux concepts

Mthodes dextension
LINQ sur les tableaux cest possible
IEnumerable<string> parisian = new Customer[] {
new Customer(),
new Customer(),
new Customer(),
new Customer()
}.Where(c => c.City == "Paris" && c.Country == "France")
.Select(c => c.CompanyName);

Nouvelle mthodes sur le type Array ?

Trop complexe intgrer utilisation des

mthodes dextension

17

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Mthodes dextension :
Dclaration

Nouveaux concepts

Greffer des mthodes sur une classe


Visibilit des membres publics uniquement
Une simple mthode static dans une classe
public static IEnumerable<TSource> Where<TSource>(this
IEnumerable<TSource> collection, Func<Tsource, bool>
predicate);

OU
public static IEnumerable<TSource> Where<TSource>(this
IEnumerable<TSource>, Expression<Func<TSource, bool>>
expr);

Pourquoi deux signatures pour Where ?


18

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Nouveaux concepts

Delegate vs Expression ?
Reprenons la requte :
var parisanCustomers =
customers
.Where(c => c.City == "Paris" && c.Country == "France")
.Select(delegate(Customer c) {
return new { c.CompanyName } ;
});

SELECT * FROM customers et on boucle en

local ?
Collections Oui
Donnes distantes Inacceptable
19

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Nouveaux concepts

Lambda expression
Rcuprer des langages fonctionnels
Syntaxe simple

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


expression
Les types sont optionnels
Exemple :
c => c.City == "Paris" && c.Country == "France"

Gnre un arbre de lexpression


Ou un delegate
20

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Delegate vs Expression : la
rponse

Nouveaux concepts

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

21

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Sommaire
Prsentation

Nouveaux concepts
Immersion dans le Framework
Commandes avances et prcautions
Pour conclure

22

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Un arbre dexpressions ? Un AST


?

Immersion dans le Framework

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
23

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Immersion dans le Framework

Une requte dans le Framework

24

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Immersion dans le Framework

Excution dune requte


Exemple : LINQ To Entities

25

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Sommaire
Prsentation

Nouveaux concepts
Immersion dans le Framework
Commandes avances et prcautions
Pour conclure

26

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Commandes avances et
prcautions

Liste des clauses


Obligatoires
1re From
from c in customers

Dernire Select ou Group by


select c.CompanyName;

27

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

group c by c.CompanyName;

Xpos 2010

Commandes avances et
prcautions

Liste des clauses


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
28

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Commandes avances et
prcautions

Les oprateurs (Aggregate)


Opration sur un (sous-)ensemble de donnes
Avec slecteur de champs

Count
Sum
Min/Max
Average

Avec comparateur

29

Distinct
Union
Exept
Intersect

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Sources derreurs : LINQ to


Object

Commandes avances et
prcautions

Simple somme en LINQ


int totalStock = (from p in products
select p.UnitsInStock).Sum();

Problme 2 boucles
Select

Sum()

Solution : Le slecteur de la mthode Sum()


int totalStock = products.Sum(p =>
p.UnitsInStock);

Requte optimise avec LINQ to ADO.NET et LINQ to

XML
30

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Sommaire
Prsentation

Nouveaux concepts
Immersion dans le Framework
Commandes avances et prcautions
Pour conclure

31

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Pour conclure

LINQ to
ADO.NET Data Services
Oracle, MySQL, PostgreSQL, SQLite, Ingres,

32

Microsoft SQL Server


Entities (Entity Framework)
System Search (Windows Search)
Google (Search)
NHibernate
CSV
Twitter

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Pour conclure

Autres implmentation
Javascript :
jLinq
JSINQ
LINQ to JavaScript

PHPLinq
Java :
Quaere
JaQue

JaQu
Querydsl
33

LINQ par Jonathan Barbosa - Ingnieurs 2000 IR 3

Xpos 2010

Pour conclure

Rfrences
Excellent cours en anglais sur LINQ :

34

http://webcourse.cs.technion.ac.il/234319/Spring2
009/ho/WCFiles/09%20LINQ.pdf
MSDN LINQ Home page:
http://msdn.microsoft.com/enus/library/bb308961.aspx
LINQ attention bien lutiliser :
http://blog.developpez.com/index.php?blog=121&
title=linq_attention_a_bien_l_utiliser
Liste des LINQ providers :
http://en.wikipedia.org/wiki/Language_Integrated_
LINQ
par Jonathan Barbosa - Ingnieurs 2000 Query
Xpos 2010
IR 3

Merci de votre attention !


Question ?

Vous aimerez peut-être aussi