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