Kader Yildirim
LINQ à 360 degré, Partie 3
Cet article présente les principales fonctionnalités apportées par LINQ to DataSet
Par Kader Yildirim publié le 01/07/2007 à 20:47, lu 3656 fois, 6 pages
 5 | LINQ et les DataSets typés
La gestion des DataSet typés par LINQ est semblable à ce que nous avons vu pour la gestion des documents XML typés par un XSD. En effet avec un DataSet typé, il est possible d'accéder directement aux différents enregistrements et colonnes des tables avec les types corrects.

La première étape est avant tout de générer un DataSet typé. Pour cela nous allons créer un XSD qui représente la structure de nos données :

<?xml version="1.0" standalone="yes"?>

<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"

           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

  <xs:element name="NewDataSet" msdata:IsDataSet="true"

              msdata:UseCurrentLocale="true">

    <xs:complexType>

      <xs:choice minOccurs="0" maxOccurs="unbounded">

        <xs:element name="Client">

          <xs:complexType>

            <xs:sequence>

              <xs:element name="ID" type="xs:int" />

              <xs:element name="Nom" type="xs:string" />

              <xs:element name="Prenom" type="xs:string" />

              <xs:element name="Tel" type="xs:string" minOccurs="0" />

            </xs:sequence>

          </xs:complexType>

        </xs:element>

        <xs:element name="Commande">

          <xs:complexType>

            <xs:sequence>

              <xs:element name="ID" type="xs:int" />

              <xs:element name="Date" type="xs:dateTime" />

              <xs:element name="Quantite" type="xs:int" />

              <xs:element name="ClientID" type="xs:int" />

            </xs:sequence>

          </xs:complexType>

        </xs:element>

      </xs:choice>

    </xs:complexType>

    <xs:unique name="Constraint1" msdata:PrimaryKey="true">

      <xs:selector xpath=".//Client" />

      <xs:field xpath="ID" />

    </xs:unique>

    <xs:unique name="Commande_Constraint1" msdata:ConstraintName="Constraint1"

               msdata:PrimaryKey="true">

      <xs:selector xpath=".//Commande" />

      <xs:field xpath="ID" />

    </xs:unique>

    <xs:keyref name="CommandeClient" refer="Constraint1">

      <xs:selector xpath=".//Commande" />

      <xs:field xpath="ClientID" />

    </xs:keyref>

  </xs:element>

</xs:schema>

Vous trouverez sur le site suivant comment faire correspondre les contraintes d'un XSD avec ceux du DataSet.

Si vous utilisez l'utilitaire xsd.exe d'Orcas avec l'option /d vous pouvez générer un DataSet typé. Mais malheureusement le DataSet généré n'est pas compatible avec LINQ. Pour avoir un DataSet compatible il faut dans Visual Studio Orcas, ajouter le custom tool MSDataSetGenerator au schema et l'exécuter :
 
/content/94bd08a5-6ce2-43ac-8921-fd2a8432ba04/DataSet.PNG
 
La méthode de chargement des données devient alors :

static NewDataSet BuildDataTyped()

        {

            NewDataSet dst = new NewDataSet();

 

            dst.Client.Rows.Add(new object[] { 123, "Robert", "Dupont", "123456789" });

            dst.Client.Rows.Add(new object[] { 456, "Pierre", "Dubois", null });

            dst.Client.Rows.Add(new object[] { 789, "Paul", "Durand", "987654321" });

 

            dst.Commande.Rows.Add(new object[] { 1230, new DateTime(2007, 06, 01), 5, 123 });

            dst.Commande.Rows.Add(new object[] { 4560, new DateTime(2007, 02, 01), 2, 456 });

            dst.Commande.Rows.Add(new object[] { 3210, new DateTime(2007, 05, 01), 9, 123 });

            dst.Commande.Rows.Add(new object[] { 6540, new DateTime(2006, 12, 01), 7, 456 });

 

            return dst;

        }

Le code de traitement devient :

static void DoJobNewWay4(NewDataSet ds)

        {

            var CommandesPassees = from cmd in ds.Commande

                                   select new

                                   {

                                       CommandeID = cmd.ID,

                                       Client = cmd.ClientRow.Nom,

                                       Tel = cmd.ClientRow.IsNull("Tel") ? "-inconnu-" : cmd.ClientRow.Tel,

                                       Quantite = cmd.Quantite

                                   };

 

            foreach (var c in CommandesPassees)

                Console.WriteLine(c.CommandeID + " : " + c.Client + " : " + c.Tel + " : " + c.Quantite);

        }

Comme vous pouvez le constater le code est beaucoup plus simple que dans le cas précédent. L'objectif de tous ces outils est de typer un maximum d'éléments non seulement pour améliorer la productivité des équipes de développement à l'aide, par exemple, d'IntelliSense mais aussi de vérifier un maximum de cas dès la compilation.
 
» Démarrer une discussion
 
Discussion démarée par Matthieu Mezil le 02/07/2007 à 16:38, 2 commentaire(s).