linq to dataset

Upload: leajohnn

Post on 04-Apr-2018

259 views

Category:

Documents


0 download

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