Linq To Dataset
Linq To Dataset
James RAVAILLE
http://blogs.dotnet-france.com/jamesr
Matthieu LAFFONT
LINQ to DataSet
Sommaire
Introduction ..................................................................................................................................... 3 1.1 1.2 1.3 Prsentation des DataSets ...................................................................................................... 3 Prsentation de Linq To DataSet ............................................................................................. 3 Pr-requis ................................................................................................................................ 3
2 3
Prsentation de la source de donnes ............................................................................................ 4 Ecrire des requtes LINQ sur un DataSet non typ ......................................................................... 6 3.1 3.2 3.3 3.4 3.5 Cration du DataSet ................................................................................................................ 6 Excuter une requte LINQ ..................................................................................................... 8 Afficher la liste des stagiaires .................................................................................................. 9 Afficher la liste des stagiaires et de leurs cours ...................................................................... 9 Accder aux donnes rsultant de lexcution de requtes LINQ ........................................ 11
Ecrire des requtes LINQ sur un DataSet typ .............................................................................. 12 4.1 4.2 4.3 Conception du DataSet typ.................................................................................................. 12 Cration du DataSet typ ...................................................................................................... 13 Ecriture de requtes LINQ ..................................................................................................... 14 Liste des stagiaires ......................................................................................................... 14 Liste des stagiaires et de leurs cours ............................................................................. 14
4.3.1 4.3.2 5
Conclusion ..................................................................................................................................... 16
LINQ to DataSet
1 Introduction
1.1 Prsentation des DataSets
Un DataSet est un groupe de donnes organises de manire relationnelle. Un DataSet ressemble une base de donnes relationnelle. Il est constitu de DataTable, relies entre elles par des DataRelation. Les DataTable sont structures par des champs (DataColumn), et contiennent des enregistrements (DataRow), eux-mmes contenant les donnes.
1.3 Pr-requis
Avant daborder ce cours, nous vous conseillons de lire les chapitres Introduction au LINQ , LINQ to Objects , publis sur Dotnet-France. Aussi, mme si nous labordons sommairement dans ce cours, si vous avez besoin de plus amples informations sur la cration dun DataSet, nous vous conseillons de lire le cours Utilisation du DataSet en mode deconnect .
LINQ to DataSet
LINQ to DataSet
ALTER TABLE [dbo].[Stagiaire2Cours] WITH CHECK ADD [FK_Stagiaire2Cours_Cours] FOREIGN KEY([IdCours]) REFERENCES [dbo].[Cours] ([Identifiant]) ON UPDATE CASCADE ON DELETE CASCADE
CONSTRAINT
ALTER TABLE [dbo].[Stagiaire2Cours] WITH CHECK ADD CONSTRAINT [FK_Stagiaire2Cours_Stagiaire] FOREIGN KEY([IdStagiaire]) REFERENCES [dbo].[Stagiaire] ([Identifiant]) ON UPDATE CASCADE ON DELETE CASCADE
LINQ to DataSet
Cours DataAdapter
Cours
Stagiaire2Cours DataAdapter
Stagiaire2Cours
Stagiaire DataAdapter
Stagiaire
DataSet
Base de donnes
LINQ to DataSet
// C# using System.Data; using System.Data.SqlClient; // ... // ... // Variables locales. DataSet oDataSet; string sChaineConnexion; SqlDataAdapter oDaStagiaire, oDaStagiaireToCours, oDaCours; try { // Initialisation. sChaineConnexion = @"Data source=localhost\sql2005; Initial Catalog=DotnetFrance_ExoRequetes; Integrated Security=True"; // Cration du DataSet. oDataSet = new DataSet("DotnetFrance"); // Cration et alimentation de la table Stagiaire dans le DataSet. oDaStagiaire = new SqlDataAdapter("SELECT * FROM Stagiaire", sChaineConnexion); oDaStagiaire.Fill(oDataSet, "Stagiaire"); // Cration et alimentation de la table Cours dans le DataSet. oDaCours = new SqlDataAdapter("SELECT * FROM Cours", sChaineConnexion); oDaCours.Fill(oDataSet, "Cours"); // Cration et alimentation de la table Stagiaire2Cours dans le DataSet. oDaStagiaireToCours = new SqlDataAdapter("SELECT * FROM Stagiaire2Cours", sChaineConnexion); oDaStagiaireToCours.Fill(oDataSet, "Stagiaire2Cours"); // Cration des relations entre les tables dans le DataSet. oDataSet.Relations.Add("Stagiaire_Stagiaire2Cours", oDataSet.Tables["Stagiaire"].Columns["Identifiant"], oDataSet.Tables["Stagiaire2Cours"].Columns["IdStagiaire"]); oDataSet.Relations.Add("Stagiaire2Cours_Stagiaire", oDataSet.Tables["Stagiaire2Cours"].Columns["IdCours"], oDataSet.Tables["Cours"].Columns["Identifiant"]); } catch (Exception aEx) { MessageBox.Show(aEx.Message); }
LINQ to DataSet
' VB.NET using System.Data; using System.Data.SqlClient; ' ... ' ... ' Variables locales. Dim oDataSet As DataSet Dim sChaineConnexion As String Dim oDaStagiaire As SqlDataAdapter Dim oDaStagiaireToCours As SqlDataAdapter Dim oDaCours As SqlDataAdapter Try ' Initialisation. sChaineConnexion = "Data source=localhost\sql2005; Initial Catalog=DotnetFrance_ExoRequetes; Integrated Security=True" ' Cration du DataSet. oDataSet = New DataSet("DotnetFrance") ' Cration et alimentation de la table Stagiaire dans le DataSet. oDaStagiaire = New SqlDataAdapter("SELECT * FROM Stagiaire", sChaineConnexion) oDaStagiaire.Fill(oDataSet, "Stagiaire") ' Cration et alimentation de la table Cours dans le DataSet. oDaCours = New SqlDataAdapter("SELECT * FROM Cours", sChaineConnexion) oDaCours.Fill(oDataSet, "Cours") ' Cration et alimentation de la table Stagiaire2Cours dans le DataSet. oDaStagiaireToCours = New SqlDataAdapter("SELECT * FROM Stagiaire2Cours", sChaineConnexion) oDaStagiaireToCours.Fill(oDataSet, "Stagiaire2Cours") ' Cration des relations entre les tables dans le DataSet. oDataSet.Relations.Add("Stagiaire_Stagiaire2Cours", _ oDataSet.Tables("Stagiaire").Columns("Identifiant"), _ oDataSet.Tables("Stagiaire2Cours").Columns("IdStagiaire")) oDataSet.Relations.Add("Stagiaire2Cours_Stagiaire", _ oDataSet.Tables("Stagiaire2Cours").Columns("IdCours"), _ oDataSet.Tables("Cours").Columns("Identifiant")) Catch aEx As Exception MessageBox.Show(aEx.Message) End Try
LINQ to DataSet
' VB .NET Dim oListeStagiaires As DataView = _ (From oStagiaire In oDataSet.Tables("Stagiaire").AsEnumerable() _ Order By oStagiaire.Field(Of String)("Nom"), _ oStagiaire.Field(Of String)("Prenom") _ Select oStagiaire).AsDataView() LstStagiaires.DataSource = oListeStagiaires
10
LINQ to DataSet
// C# var oListeStagiairesAvecCours = (from oStagiaire in oDataSet.Tables["Stagiaire"].AsEnumerable() from oStagiaire2Cours in oStagiaire.GetChildRows("Stagiaire_Stagiaire2Cours") from oCours in oStagiaire2Cours.GetChildRows("Stagiaire2Cours_Stagiaire") select new { NomPrenom = oStagiaire.Field<string>("Nom") + " " + oStagiaire.Field<string>("Prenom"), Cours = oCours.Field<string>("Libelle"), Duree = oCours.Field<int>("NombreJours") }).ToList(); LstCoursStagiaires.DataSource = oListeStagiairesAvecCours;
' VB .NET Dim oListeStagiairesAvecCours = _ (From oStagiaire In oDataSet.Tables("Stagiaire").AsEnumerable() _ From oStagiaire2Cours In oStagiaire.GetChildRows("Stagiaire_Stagiaire2Cours") _ From oCours In oStagiaire2Cours.GetChildRows("Stagiaire2Cours_Stagiaire") _ Select New With { _ .NomPrenom = oStagiaire.Field(Of String)("Nom") + " " + oStagiaire.Field(Of String)("Prenom"), _ .Cours = oCours.Field(Of String)("Libelle"), _ .Duree = oCours.Field(Of Integer)("NombreJours") _ }).ToList() LstCoursStagiaires.DataSource = oListeStagiairesAvecCours
Vous remarquerez : Lutilisation dun type anonyme, permettant de raliser une projection de donnes, afin dobtenir uniquement le nom et prnom du stagiaire agrg au sein dune mme proprit, le libell et la dure des cours auxquels ils sont inscrits. Lutilisation de la mthode GetChildRows, permettant dobtenir un tableau de DataRow dpendant, au travers dune relation que nous avons prcdemment dfinie. En loccurrence, elle est utilise pour obtenir la liste des cours des stagiaires. Voici le rsultat dexcution :
11
LINQ to DataSet
Les blocs de code ci-dessous illustre leur utilisation, en remplissant une liste des donnes de type ListBox :
// C# LstNomsPrenoms.Items.Clear(); foreach (DataRowView oStagiaire in oListeStagiaires) { LstNomsPrenoms.Items.Add(oStagiaire.Row.Field<string>("Nom") + " " + oStagiaire.Row.Field<string>("Prenom")); }
' VB.NET LstNomsPrenoms.Items.Clear() For Each oStagiaire As DataRowView In oListeStagiaires LstNomsPrenoms.Items.Add(oStagiaire.Row.Field(Of String)("Nom") + " " + oStagiaire.Row.Field(Of String)("Prenom")) Next
12
LINQ to DataSet
Puis, dans la fentre Explorateur de serveurs, crez une connexion vers votre base de donnes. Aprs avoir accd aux tables, faire glisser les tables voulues vers le DataSet.
13
LINQ to DataSet
Nous pouvons observer la cration : De DataTable, ayant la mme structure que les tables de la base de donnes. De TableApdater, qui correspondent des DataAdapter spcialiss par DataTable, permettant dalimenter une table, et rpercuter les modifications des donnes dans la base de donnes. De relations entre les DataTable, issues des relations entre les tables de la base de donnes.
14
LINQ to DataSet
' VB .NET Imports System.Data.SqlClient Imports LinqToDataSet_VB.DsEcoleTableAdapters Imports LinqToDataSet_VB.DsEcole ' ... ' ... Dim Dim Dim Dim oDsEcole As DsEcole oStagiaireTableAdapter As StagiaireTableAdapter oCoursTableAdapter As CoursTableAdapter oStagiaire2CoursTableAdapter As Stagiaire2CoursTableAdapter
oDsEcole = New DsEcole() oStagiaireTableAdapter = New StagiaireTableAdapter() oStagiaireTableAdapter.Fill(oDsEcole.Stagiaire) oCoursTableAdapter = New CoursTableAdapter() oCoursTableAdapter.Fill(oDsEcole.Cours) oStagiaire2CoursTableAdapter = New Stagiaire2CoursTableAdapter() oStagiaire2CoursTableAdapter.Fill(oDsEcole.Stagiaire2Cours)
' VB .NET Dim oListeStagiaires As List(Of StagiaireRow) = _ (From oStagiaire In oDsEcole.Stagiaire _ Order By oStagiaire.Nom, _ oStagiaire.Prenom _ Select oStagiaire).ToList()
4.3.2
Liste des stagiaires et de leurs cours Voici un bloc dinstructions, permettant dobtenir au travers dune requte LINQ, la liste des stagiaires avec pour chacun dentre eux, la liste des cours auxquels ils sont inscrits :
15
LINQ to DataSet
// C# var oListeStagiairesAvecCours = (from oStagiaire in oDsEcole.Stagiaire from oStagiaire2Cours in oStagiaire.GetStagiaire2CoursRows() select new { NomPrenom = oStagiaire.Nom + " " + oStagiaire.Prenom, Cours = oStagiaire2Cours.CoursRow.Libelle, Duree = oStagiaire2Cours.CoursRow.NombreJours }).ToList();
' VB .NET Dim oListeStagiairesAvecCours = _ (From oStagiaire In oDsEcole.Stagiaire _ From oStagiaire2Cours In oStagiaire.GetStagiaire2CoursRows() _ Select New With { _ .NomPrenom = oStagiaire.Nom + " " + oStagiaire.Prenom, _ .Cours = oStagiaire2Cours.CoursRow.Libelle, _ .Duree = oStagiaire2Cours.CoursRow.NombreJours _ }).ToList()
16
LINQ to DataSet
5 Conclusion
Dans ce cours, nous avons abord lcriture de requtes LINQ sur des DataSet typs et non typs, ainsi que des DataTable. Si vous souhaitez en apprendre davantage sur la manipulation de donnes avec LINQ, les chapitres Introduction au LINQ , LINQ to Objects et LINQ to SQL sont votre disposition le site Dotnet-France. Pour de plus amples informations sur Linq To DataSet, vous pouvez consulter le site MSDN lURL suivante : http://msdn.microsoft.com/fr-fr/library/bb386977.aspx