LINQ : Language INtegrated Query
Présentation
Pourquoi tant de langages de requête ?
En 30 ans, les developpeurs se sont vu confrontés à la multiplication des sources de données :
- Les collections objets
- Les bases de données relationnelles
- Les frameworks Object Relational Mapping (Entity Framework chez Microsoft)
- Les fichiers XML et ses déclinaisons (eXtensible Markup Language)
- Les autres fichiers structurés (CSV, tableurs, ...)
- ...
Avec toutes ces méthodes de stockage des données, sont apparus les "langages" de requête permettant l'accès à ces informations. Avec les années, les développeurs sont contraints de connaitre environ 5 à 6 langages autour de leur langage de prédilection. On retrouve parmi les plus utilisés :
- SQL (Structured Query Language) : Requête des bases de données relationnelles
- XML : Pour construire des fichiers de données
- XPath : Requête des fichiers XML
- JQL, Entity SQL, ... : Requête des objets issus d'un ORM
De nombreuses méthodes d'accès
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)
Framework ORM
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", "")); }
LINQ, la solution

Comme le montre le schéma ci-dessus, LINQ va permettre de s'abstraire de tous ces langages de requête contraignants. Avec LINQ et sa syntaxe unique, on va pouvoir accéder :
- aux bases de données
- aux collections d'objets
- aux fichiers structurés
- et encore plein d'autres sources de données...
Petit historique
LINQ est issu de plusieurs projets de recherches proposés par le Microsoft Research Center. Dirigé par Cédric Fournet à L'INRIA depuis au moins 1995, join-calculus est à la base de LINQ. Ce projet est ensuite repris par le Microsoft Research Center au lancement du projet Poliphonic C# (travaux menés par Nick Benton, Luca Cardelli et Cédric Fournet). Le but est de proposer un nouveau modèle de concurrence pour les objets du framework .NET. Si vous souhaitez en savoir plus, rendez-vous sur le site officiel du projet.
Le projet Cω est un projet parallèle du Microsoft Research Center et des équipes Microsoft SQL Server. Leur idée était de développer une technique d'accès aux magasins de données la plus simple possible. D'abord connu sous les noms de X# ou Xen, le nom Cω est apparu lors de l'intégration de Poliphonic C#. On trouve un excellent article sur le site MSDN qui montre à l'aide d'exemples ce qu'apporte Cω, en faisant le parallèle avec les magasins de données.
Enfin, après toutes ces années de recherches, LINQ sort le 19 novembre 2007 intégré au framework .NET 3.5. PLINQ (Parallele LINQ) son successeur poursuit son développement pour intégrer un système d'exécution distribué des requêtes dans des environnements mutli-core et/ou multi-processeur.