Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Chapitre 3 : Implémentation Objets<br />
Nous avons vu jusqu’ici quelle est la manière <strong>de</strong> formuler une requête syntaxiquement vali<strong>de</strong>,<br />
requête au sens <strong>de</strong> <strong>Linq</strong>. Rien n’a été spécifié en ce qui concerne la nature <strong>de</strong> la source <strong>de</strong> données,<br />
ce qui implique que tout ce qui a été vu jusqu’ici sera toujours valable tant que nous parlons <strong>de</strong> <strong>Linq</strong>.<br />
Mais <strong>Linq</strong> en lui-même n’est qu’un tas <strong>de</strong> concepts mis bout à bout. Si nous faisons le point <strong>de</strong> ce qui<br />
a déjà été vu, nous avons un formalisme pour écrire <strong>de</strong>s requêtes avec l’explication générale <strong>de</strong><br />
comment cette requête pourra être traduite vers une source <strong>de</strong> données, quelle qu’elle soit. C’est<br />
précisément cette opération <strong>de</strong> traduction qui va nécessiter <strong>de</strong> connaître cette source plus en<br />
détails. Pour répondre à cette attente, <strong>Linq</strong> est présenté avec une syntaxe unifiée, faisant abstraction<br />
(répétons-le une fois encore) <strong>de</strong> la nature du stockage <strong>de</strong>s données. Et pourtant, ce que nous<br />
appelons <strong>Linq</strong> <strong>de</strong>puis le début est en réalité un ensemble d’implémentations partageant une même<br />
syntaxe extérieure. Chaque implémentation est définie par un nom qui correspond au type <strong>de</strong><br />
données qu’elle cible. Ainsi nous parlerons <strong>de</strong> <strong>Linq</strong> to Sql, <strong>Linq</strong> to DataSet et ainsi <strong>de</strong> suite. Nous<br />
commencerons notre étu<strong>de</strong> par l’implémentation objet, <strong>Linq</strong> to Objects. Cette implémentation sera<br />
rapi<strong>de</strong>ment parcourue, examinant quelques aspects intéressants. Parmi ces aspects, nous nous<br />
intéresserons à certains opérateurs généraux (donc valables pour toutes les implémentations) et à<br />
l’interface IEnumerable que doit implémenter toute donnée désirant interagir avec <strong>Linq</strong>. Ce<br />
chapitre dans son ensemble est inspiré <strong>de</strong> [11] et <strong>de</strong> [1] pour la <strong>de</strong>scription <strong>de</strong>s opérateurs.<br />
3.1 Champ d’application<br />
<strong>Linq</strong> to Objects permet d’interagir avec toute collection qui implémente IEnumerable. Les<br />
collections standards intégrées au framework implémentent toutes cette interface, ce qui permet <strong>de</strong><br />
ne pas se poser la question dès lors qu’on utilise une structure <strong>de</strong> base. Pour ce qui est <strong>de</strong>s<br />
collections définies par l’utilisateur (le programmeur), le plus simple est <strong>de</strong> créer une collection par<br />
héritage d’une structure standard. Cela peut s’avérer être une erreur conceptuelle dans certains cas,<br />
et l’utilisateur <strong>de</strong>vra réaliser lui-même l’implémentation <strong>de</strong> cette interface. Ceci s’applique à toutes<br />
les implémentations <strong>Linq</strong>.<br />
Regardons d’un peu plus près cette fameuse interface. Elle est définie dans l’espace <strong>de</strong> noms<br />
System.Collections.Generic et la documentation 5 [4] montre que la seule métho<strong>de</strong> qui est renseignée<br />
est GetEnumerator qui doit retourner un objet capable <strong>de</strong> parcourir les éléments <strong>de</strong> la collection un à<br />
un. La documentation officielle fait également état d’un ensemble d’extensions <strong>de</strong> métho<strong>de</strong> qui<br />
représentent en fait l’ensemble <strong>de</strong>s opérateurs disponibles. Implémenter IEnumerable signifie<br />
possé<strong>de</strong>r les extensions <strong>de</strong> métho<strong>de</strong> nécessaires à <strong>Linq</strong> pour assurer le bon déroulement <strong>de</strong> requêtes<br />
écrites avec la syntaxe vue précé<strong>de</strong>mment. Nous allons maintenant nous intéresser à certains<br />
opérateurs, ne pouvant tous les détailler par manque <strong>de</strong> place (il y en a plus d’une centaine en<br />
comptant toutes les surcharges !).<br />
5 La référence exacte est : http://msdn.microsoft.com/en-us/library/9eekhta0.aspx