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 3655 fois, 6 pages
 3 | L'exemple de départ
Dans cet exemple nous avons un DataSet avec deux DataTables contenant pour l'une la liste des clients et pour l'autre les commandes passées par ces clients. La première étape consiste donc à construire le DataSet et à le remplir :

static DataSet BuildData()

        {

            DataTable dtClients = new DataTable("Client");

            dtClients.Columns.Add("ID", typeof(int));

            dtClients.Columns.Add("Nom", typeof(string));

            dtClients.Columns.Add("Prenom", typeof(string));

            dtClients.Columns.Add("Tel", typeof(string));

            dtClients.PrimaryKey = new DataColumn[] { dtClients.Columns[0] };

 

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

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

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

 

            DataTable dtCommandes = new DataTable("Commande");

            dtCommandes.Columns.Add("ID", typeof(int));

            dtCommandes.Columns.Add("Date", typeof(DateTime));

            dtCommandes.Columns.Add("Quantite", typeof(int));

            dtCommandes.Columns.Add("ClientID", typeof(int));

            dtCommandes.PrimaryKey = new DataColumn[] { dtCommandes.Columns[0] };

 

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

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

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

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

 

            DataSet ds = new DataSet();

            ds.Tables.Add(dtClients);

            ds.Tables.Add(dtCommandes);

 

            return ds;

        }

Maintenant nous souhaitons écrire une fonction qui retourne une liste contenant l'identifiant de la commande, le nom du client et la quantité de biens commandés. Avant d'écrire cette fonction nous allons ajouter une classe pour contenir le résultat de la requête :

class Resultat

    {

        private int m_CommandeID;

 

        public int CommandeID

        {

            get { return m_CommandeID; }

            set { m_CommandeID = value; }

        }

        private string m_Client;

 

        public string Client

        {

            get { return m_Client; }

            set { m_Client = value; }

        }

        private int m_Quantite;

 

        public int Quantite

        {

            get { return m_Quantite; }

            set { m_Quantite = value; }

        }

 

        public Resultat(int CommandeID, string Client, int Quantite)

        {

            this.CommandeID = CommandeID;

            this.Client = Client;

            this.Quantite = Quantite;

        }

    }

Ainsi le parcours, qui revient à faire une jointure, peut être écrit ainsi :

static void DoJobOldWay1(DataSet ds)

        {

            List<Resultat> rs = new List<Resultat>();

            foreach (DataRow cli in ds.Tables["Client"].Rows)

            {

                foreach (DataRow cmd in ds.Tables["Commande"].Rows)

                {

                    if ((int)cmd["ClientID"] == (int)cli["ID"])

                    {

                        rs.Add(new Resultat((int)cmd["ID"], (string)cli["Nom"], (int)cmd["Quantite"]));

                    }

                }

            }

 

            foreach(Resultat r in rs)

            {

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

            }

        }

Toutefois étant donné que la DataTable Commande contient une clé étrangère vers la DataTable Client, nous pouvons nous appuyer sur les DataRelation pour simplifier ce code. La première étape consiste à créer la relation :

DataSet ds = new DataSet();

            ds.Tables.Add(dtClients);

            ds.Tables.Add(dtCommandes);

            ds.Relations.Add("CommandeClient", dtClients.Columns["ID"], dtCommandes.Columns["ClientID"]);

Le code devient alors :

static void DoJobOldWay2(DataSet ds)

        {

            List<Resultat> rs = new List<Resultat>();

            foreach (DataRow cli in ds.Tables["Client"].Rows)

            {

                foreach (DataRow cmd in cli.GetChildRows("CommandeClient"))

                {

                    rs.Add(new Resultat((int)cmd["ID"], (string)cli["Nom"], (int)cmd["Quantite"]));

                }

            }

 

            foreach (Resultat r in rs)

            {

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

            }

        }

Ce code même s'il est plus clair que le premier reste malgré tout assez éloigné des mécanismes utilisés lorsque nous faisons des requêtes sur une base de données.
 
» Démarrer une discussion
 
Discussion démarée par Matthieu Mezil le 02/07/2007 à 16:38, 2 commentaire(s).