linq to dataset
TRANSCRIPT
-
7/29/2019 Linq to Dataset
1/16
ADO.NET
LINQ
LINQ to DataSetVersion 1.0
James RAVAILLE
http://blogs.dotnet-france.com/jamesr
Matthieu LAFFONT
http://blogs.dotnet-france.com/jamesrhttp://blogs.dotnet-france.com/jamesrhttp://blogs.dotnet-france.com/jamesr -
7/29/2019 Linq to Dataset
2/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
2 LINQ to DataSet
Sommaire
1 Introduction ..................................................................................................................................... 3
1.1 Prsentation des DataSets ...................................................................................................... 3
1.2 Prsentation de Linq To DataSet ............................................................................................. 3
1.3 Pr-requis ................................................................................................................................ 3
2 Prsentation de la source de donnes ............................................................................................ 4
3 Ecrire des requtes LINQ sur un DataSet non typ ......................................................................... 6
3.1 Cration du DataSet ................................................................................................................ 6
3.2 Excuter une requte LINQ ..................................................................................................... 8
3.3 Afficher la liste des stagiaires .................................................................................................. 9
3.4 Afficher la liste des stagiaires et de leurs cours ...................................................................... 9
3.5 Accder aux donnes rsultant de lexcution de requtes LINQ........................................ 11
4 Ecrire des requtes LINQ sur un DataSet typ .............................................................................. 12
4.1 Conception du DataSet typ.................................................................................................. 12
4.2 Cration du DataSet typ ...................................................................................................... 13
4.3 Ecriture de requtes LINQ ..................................................................................................... 14
4.3.1 Liste des stagiaires ......................................................................................................... 14
4.3.2 Liste des stagiaires et de leurs cours ............................................................................. 14
5 Conclusion ..................................................................................................................................... 16
-
7/29/2019 Linq to Dataset
3/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
3 LINQ to DataSet
1 Introduction1.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 desenregistrements (DataRow), eux-mmes contenant les donnes.
1.2 Prsentation de Linq To DataSetLINQ To DataSet, comme son nom le suggre, permet de requter sur un DataSet. Toutes les
requtes sur des donnes du DataSet ne demanderont aucune future connexion la source de
donnes, ayant permis de lalimenter.
Quels sont les cas dutilisation de LINQ To DataSet ? Dans une application .NET, vous pouvez
tre amen travailler avec une DataSet, que vous avez obtenu :
- En le crant dynamiquement ( la main ) lors de lexcution de lapplication.- Via lexcution dun service de donnes (par exemple un service Web, ).- En excutant une requte SQL de slection tabulaire (requte SQL de slection retournant un
tableau de donnes) sur une base de donnes.
-
1.3
Pr-requisAvant 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 .
http://intranet.dotnet-france.com/Team%20Documents/Cours%20des%20stagiaires/EN%20COURS%20-%20ADO.NET%20et%20LINQ%20[70-561]/Cours/ADO.NET%20-%20Chapitre%2004%20-%20Utilisation%20du%20DataSet%20en%20mode%20deconnecte.docx -
7/29/2019 Linq to Dataset
4/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
4 LINQ to DataSet
2 Prsentation de la source de donnesVoici une prsentation du schma de la base de donnes SQL Server, que nous allons utiliser
pour alimenter nos DataSet:
Voici le script de base de donnes, permettant de crer ce schma de base de donnes :
// SQL
CREATETABLE [dbo].[Stagiaire]([Identifiant] [int] IDENTITY(1,1)NOTNULL,[Nom] [varchar](50)NOTNULL,[Prenom] [varchar](50)NOTNULL,[DateInscription] [datetime] NULL,[Actif] [bit] NULL,
CONSTRAINT [PK_Stagiaire] PRIMARYKEYCLUSTERED(
[Identifiant] ASC)WITH(IGNORE_DUP_KEY =OFF)ON [PRIMARY],CONSTRAINT [UQ__Stagiaire__7F60ED59] UNIQUENONCLUSTERED
([Identifiant] ASC
)WITH(IGNORE_DUP_KEY =OFF)ON [PRIMARY])ON [PRIMARY]
CREATETABLE [dbo].[Cours]([Identifiant] [int] IDENTITY(1,1)NOTNULL,[Libelle] [varchar](50)NOTNULL,[NombreJours] [int] NOTNULL,
CONSTRAINT [PK_Cours] PRIMARYKEYCLUSTERED(
[Identifiant] ASC)WITH(IGNORE_DUP_KEY =OFF)ON [PRIMARY],
CONSTRAINT [UQ__Cours__023D5A04] UNIQUENONCLUSTERED([Identifiant] ASC
)WITH(IGNORE_DUP_KEY =OFF)ON [PRIMARY])ON [PRIMARY]
CREATETABLE [dbo].[Stagiaire2Cours]([IdStagiaire] [int] NOTNULL,[IdCours] [int] NOTNULL,
CONSTRAINT [PK_Stagiaire2Cours] PRIMARYKEYCLUSTERED(
[IdStagiaire] ASC,[IdCours] ASC
)WITH(IGNORE_DUP_KEY =OFF)ON [PRIMARY])ON [PRIMARY]
-
7/29/2019 Linq to Dataset
5/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
5 LINQ to DataSet
ALTERTABLE [dbo].[Stagiaire2Cours] WITHCHECKADD CONSTRAINT[FK_Stagiaire2Cours_Cours] FOREIGNKEY([IdCours])REFERENCES [dbo].[Cours] ([Identifiant])ONUPDATECASCADEONDELETECASCADE
ALTERTABLE [dbo].[Stagiaire2Cours] WITHCHECKADD CONSTRAINT
[FK_Stagiaire2Cours_Stagiaire] FOREIGNKEY([IdStagiaire])REFERENCES [dbo].[Stagiaire] ([Identifiant])ONUPDATECASCADEONDELETECASCADE
-
7/29/2019 Linq to Dataset
6/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
6 LINQ to DataSet
3 Ecrire des requtes LINQ sur un DataSet non typ3.1 Cration du DataSet
Dans les blocs de code ci-dessous, nous allons crer un DataSet. Ce DataSetaura la mme
structure que notre base de donnes : il contiendra trois tables, telles quelles sont indiques dans le
schma ci-dessous. Pour crer et alimenter ces trois tables au sein de notre DataSet, nous creronstrois DataAdapter:
DataSet
Stagiaire2Cours
Cours
Stagiaire
Base de donnes
Stagiaire2Cours
Cours
Stagiaire
DataAdapter
DataAdapter
DataAdapter
Stagiaire2Cours
-
7/29/2019 Linq to Dataset
7/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
7 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 = newDataSet("DotnetFrance");
// Cration et alimentation de la table Stagiaire dans le DataSet.oDaStagiaire = newSqlDataAdapter("SELECT * FROM Stagiaire",
sChaineConnexion);oDaStagiaire.Fill(oDataSet, "Stagiaire");
// Cration et alimentation de la table Cours dans le DataSet.oDaCours = newSqlDataAdapter("SELECT * FROM Cours",
sChaineConnexion);oDaCours.Fill(oDataSet, "Cours");
// Cration et alimentation de la table Stagiaire2Cours dans le
DataSet.oDaStagiaireToCours = newSqlDataAdapter("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);}
-
7/29/2019 Linq to Dataset
8/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
8 LINQ to DataSet
3.2 Excuter une requte LINQLexcution de requtes sur une DataTable est relativement similaire ltablissement de
requte un objet contenant un ensemble de donnes, dont les classes ayant permis de les crer
implmente linterface IEnumerable du Framework .NET. Cependant, la classe DataTable
nimplmente pas cette interface. Cest pourquoi, il est ncessaire de lui appliquer la mthodeAsEnumerable() pour requter lensemble des DataRow composant les DataTable, et la mthode
Field() / Field (Of T) sur les DataRow (lignes) des DataTable pour accder aux DataColumn
(champs).
' VB.NET
using System.Data;using System.Data.SqlClient;
' ...' ...
' Variables locales.Dim oDataSet As DataSetDim sChaineConnexion AsStringDim oDaStagiaire As SqlDataAdapterDim oDaStagiaireToCours As SqlDataAdapterDim 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 leDataSet.
oDaStagiaireToCours = New SqlDataAdapter("SELECT * FROMStagiaire2Cours", 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 ExceptionMessageBox.Show(aEx.Message)
EndTry
-
7/29/2019 Linq to Dataset
9/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
9 LINQ to DataSet
3.3 Afficher la liste des stagiairesVoici un bloc dinstructions, permettant dobtenir la liste des stagiaires via une requte LINQ,
tris suivant le nom et le prnom dans lordre alphabtique, et de lafficher dans une grille de
donnes via une opration de DataBinding :
On obtient le rsultat suivant :
3.4 Afficher la liste des stagiaires et de leurs coursVoici 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, et de lafficher
dans une grille de donnes via une opration de DataBinding :
' VB .NET
Dim oListeStagiaires As DataView = _(From oStagiaire In oDataSet.Tables("Stagiaire").AsEnumerable() _OrderBy oStagiaire.Field(OfString)("Nom"), _
oStagiaire.Field(OfString)("Prenom") _Select oStagiaire).AsDataView()
LstStagiaires.DataSource = oListeStagiaires
// C#
DataView oListeStagiaires =(from oStagiaire in oDataSet.Tables["Stagiaire"].AsEnumerable()orderby oStagiaire.Field("Nom"),
oStagiaire.Field("Prenom")select oStagiaire).AsDataView();
LstStagiaires.DataSource = oListeStagiaires;
-
7/29/2019 Linq to Dataset
10/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
10 LINQ to DataSet
Vous remarquerez :
- Lutilisation dun type anonyme, permettant de raliser une projection de donnes, afindobtenir 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 DataRowdpendant, 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 :
' 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") _SelectNewWith { _
.NomPrenom = oStagiaire.Field(OfString)("Nom") + " " +oStagiaire.Field(OfString)("Prenom"), _
.Cours = oCours.Field(OfString)("Libelle"), _
.Duree = oCours.Field(OfInteger)("NombreJours") _
}).ToList()
LstCoursStagiaires.DataSource = oListeStagiairesAvecCours
// C#
var oListeStagiairesAvecCours =(from oStagiaire in oDataSet.Tables["Stagiaire"].AsEnumerable()from oStagiaire2Cours in
oStagiaire.GetChildRows("Stagiaire_Stagiaire2Cours")from oCours in
oStagiaire2Cours.GetChildRows( "Stagiaire2Cours_Stagiaire")selectnew{
NomPrenom = oStagiaire.Field("Nom") + " " +oStagiaire.Field("Prenom"),
Cours = oCours.Field("Libelle"),Duree = oCours.Field("NombreJours")
}).ToList();
LstCoursStagiaires.DataSource = oListeStagiairesAvecCours;
-
7/29/2019 Linq to Dataset
11/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
11 LINQ to DataSet
3.5 Accder aux donnes rsultant de lexcution de requtes LINQSur un DataSet, il est aussi possible daccder aux donnes sans utiliser de requte, via
linstruction itrativeforeach / For Each. L aussi, nous retrouvons lobligation dutiliser les mthodes
suivantes :
- Field() / Field(Of T) pour lire les donnes dans les champs des enregistrements.- SetField() / SetField(Of T) pour modifier les donnes dans les champs des
enregistrements.
Les blocs de code ci-dessous illustre leur utilisation, en remplissant une liste des donnes de
type ListBox:
Le rsultat dexcution de ce bloc dinstructions est le suivant :
' VB.NET
LstNomsPrenoms.Items.Clear()ForEach oStagiaire As DataRowView In oListeStagiaires
LstNomsPrenoms.Items.Add(oStagiaire.Row.Field( OfString)("Nom") + " "
+ oStagiaire.Row.Field(OfString)("Prenom"))Next
// C#
LstNomsPrenoms.Items.Clear();foreach (DataRowView oStagiaire in oListeStagiaires){
LstNomsPrenoms.Items.Add(oStagiaire.Row.Field< string>("Nom") + " " +oStagiaire.Row.Field("Prenom"));
}
-
7/29/2019 Linq to Dataset
12/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
12 LINQ to DataSet
4 Ecrire des requtes LINQ sur un DataSet typLutilisation dun DataSettyp, permet dcrire des requtes LINQ plus simples.
4.1 Conception du DataSet typPour crer un DataSettyp dans Visual Studio, ajouter un Nouvel lment au projet de
type DataSet . Nommez le, puis validez en cliquant sur le boutonAjouter:
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.
-
7/29/2019 Linq to Dataset
13/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
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.
4.2 Cration du DataSet typVoici les blocs dinstructions permettant de crer un DataSettyp :
// C#
using System.Data.SqlClient;using LinqToDataSet_CS;using LinqToDataSet_CS.DsEcoleTableAdapters;
// ...// ...
DsEcole oDsEcole;StagiaireTableAdapter oStagiaireTableAdapter;CoursTableAdapter oCoursTableAdapter;Stagiaire2CoursTableAdapter oStagiaire2CoursTableAdapter;
oDsEcole = newDsEcole();oStagiaireTableAdapter = newStagiaireTableAdapter();oStagiaireTableAdapter.Fill(oDsEcole.Stagiaire);
oCoursTableAdapter = newCoursTableAdapter();
oCoursTableAdapter.Fill(oDsEcole.Cours);
oStagiaire2CoursTableAdapter = newStagiaire2CoursTableAdapter();oStagiaire2CoursTableAdapter.Fill(oDsEcole.Stagiaire2Cours);
-
7/29/2019 Linq to Dataset
14/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
14 LINQ to DataSet
4.3 Ecriture de requtes LINQ4.3.1 Liste des stagiaires
Voici un bloc dinstructions, permettant dobtenir au travers dune requte LINQ, la liste des
stagiaires :
4.3.2 Liste des stagiaires et de leurs coursVoici 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 :
' VB .NET
Dim oListeStagiaires As List(Of StagiaireRow) = _(From oStagiaire In oDsEcole.Stagiaire _OrderBy oStagiaire.Nom, _
oStagiaire.Prenom _Select oStagiaire).ToList()
// C#
List oListeStagiaires =(from oStagiaire in oDsEcole.Stagiaireorderby oStagiaire.Nom,
oStagiaire.Prenomselect oStagiaire).ToList();
' VB .NET
Imports System.Data.SqlClientImports LinqToDataSet_VB.DsEcoleTableAdaptersImports LinqToDataSet_VB.DsEcole
' ...
' ...
Dim oDsEcole As DsEcoleDim oStagiaireTableAdapter As StagiaireTableAdapterDim oCoursTableAdapter As CoursTableAdapterDim 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)
-
7/29/2019 Linq to Dataset
15/16
Dotnet France Association / James RAVAILLE Matthieu LAFFONT
15 LINQ to DataSet
' VB .NET
Dim oListeStagiairesAvecCours = _(From oStagiaire In oDsEcole.Stagiaire _From oStagiaire2Cours In oStagiaire.GetStagiaire2CoursRows() _SelectNewWith { _
.NomPrenom = oStagiaire.Nom + " " + oStagiaire.Prenom, _.Cours = oStagiaire2Cours.CoursRow.Libelle, _
.Duree = oStagiaire2Cours.CoursRow.NombreJours _}).ToList()
// C#
var oListeStagiairesAvecCours =(from oStagiaire in oDsEcole.Stagiairefrom oStagiaire2Cours in oStagiaire.GetStagiaire2CoursRows()selectnew{
NomPrenom = oStagiaire.Nom + " " + oStagiaire.Prenom,Cours = oStagiaire2Cours.CoursRow.Libelle,Duree = oStagiaire2Cours.CoursRow.NombreJours
}).ToList();
-
7/29/2019 Linq to Dataset
16/16
16 LINQ to DataSet
5 ConclusionDans ce cours, nous avons abord lcriture de requtes LINQ sur des DataSettyps 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
http://msdn.microsoft.com/fr-fr/library/bb386977.aspxhttp://msdn.microsoft.com/fr-fr/library/bb386977.aspxhttp://msdn.microsoft.com/fr-fr/library/bb386977.aspxhttp://msdn.microsoft.com/fr-fr/library/bb386977.aspx