12.07.2013 Views

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

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

4.3 <strong>Linq</strong> to DataSet<br />

Un DataSet est quelque chose <strong>de</strong> très proche <strong>de</strong> la notion <strong>de</strong>s classes entités vues précé<strong>de</strong>mment. Il<br />

s’agit d’une représentation en mémoire d’une collection <strong>de</strong> données. Précisons qu’un DataSet est<br />

une représentation générique puisque la collection <strong>de</strong> données est une représentation d’une source<br />

<strong>de</strong> données que cette <strong>de</strong>rnière soit d’origine relationnelle ou non. Les DataSets font partie <strong>de</strong> la<br />

couche <strong>de</strong> données ADO.NET et n’ont donc pas été introduits par <strong>Linq</strong>. La couche d’accès aux<br />

données ADO.NET fait un grand usage <strong>de</strong>s DataSets, notamment en lecture pour conserver <strong>de</strong>s<br />

informations <strong>de</strong> structure liées aux données. Il est assez logique que <strong>Linq</strong> propose une<br />

implémentation <strong>de</strong>stinée à interroger ces structures. Nous allons poursuivre notre étu<strong>de</strong> avec<br />

l’analyse cette implémentation nommée <strong>Linq</strong> to DataSet. Cette section est gran<strong>de</strong>ment inspirée <strong>de</strong><br />

[1] et <strong>de</strong> [4]. Comme son nom l’indique, cette implémentation a pour cibles <strong>de</strong>s objets <strong>de</strong> type<br />

DataSet. Cette section ne sera pas découpée en sous-parties car <strong>Linq</strong> n’introduit que peu <strong>de</strong><br />

nouveautés en ce qui concerne les DataSets. L’étu<strong>de</strong> approfondie <strong>de</strong>s mécanismes sous-jacents aux<br />

DataSets en général n’entre pas dans le cadre <strong>de</strong> ce travail et nous les passerons sous silence. Pour<br />

pouvoir être utilisable par une implémentation <strong>Linq</strong>, il est nécessaire d’implémenter l’interface<br />

IEnumerable. Sans nous étendre sur le sujet, signalons qu’il y a moyen <strong>de</strong> créer <strong>de</strong>s DataSets<br />

typés mais en toute généralité un DataSet doit être considéré comme non typé et n’implémente<br />

donc pas la fameuse interface. Nous ne considèrerons ici que les DataSets non typés et nous<br />

tenterons d’éclaircir comment les utiliser en tant que IEnumerable.<br />

Etant un concept abstrait, les DataSets peuvent être construits <strong>de</strong>puis n’importe quel type <strong>de</strong> base<br />

<strong>de</strong> données. Ils disposent en outre <strong>de</strong> mécanismes pour recréer la structure <strong>de</strong>s tables relationnelles<br />

sous-jacentes. Un mapping ? En effet, cela y ressemble fortement, mais celui-ci doit être<br />

explicitement spécifié « à la main » par le développeur. Pour interroger <strong>de</strong> telles structures, <strong>Linq</strong> a<br />

réalisé une implémentation spécifique appelée « <strong>Linq</strong> to DataSet ». Ceci permet <strong>de</strong> bénéficier <strong>de</strong><br />

toutes les améliorations apportées par <strong>Linq</strong> sur <strong>de</strong>s structures pouvant s’interfacer sur n’importe<br />

quel type <strong>de</strong> base <strong>de</strong> données. Ceci n’est en aucun cas le remè<strong>de</strong> universel au vi<strong>de</strong> laissé par <strong>Linq</strong> to<br />

Sql puisque ce ne sont que les DataSets qui sont interrogeables. Leur construction ainsi que le suivi<br />

<strong>de</strong>s modifications vers la base <strong>de</strong> données sont encore à faire. Un DataSet représentant une cache <strong>de</strong><br />

base <strong>de</strong> données est classiquement construit à partir d’un DataAdapter (c’est-à-dire en utilisant la<br />

couche ADO.NET). A noter qu’il est possible d’utiliser <strong>Linq</strong> pour remplir un DataSet sans passer par un<br />

DataAdapter, mais cela suppose d’avoir préalablement récupéré les données et <strong>de</strong> les avoir sous<br />

forme IEnumerable.<br />

Pour pouvoir utiliser <strong>Linq</strong> sur une table d’un DataSet, il faut donc explicitement créer un mapping<br />

avec la fonction TableMappings.Add(string sourceTable, string DataSetTable) du DataSet. Pour que<br />

cette table soit énumérable, il faut utiliser l’opérateur AsEnumerable qui sera, dans ce cas-ci, utilisé<br />

sur une DataTable. Voyons un exemple utilisant une base <strong>de</strong> données MySql (sa procédure <strong>de</strong><br />

construction est détaillée dans l’annexe 3 : utilisation d’une base <strong>de</strong> données MySql avec <strong>Linq</strong> to<br />

DataSet).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!