Kader Yildirim
LINQ à 360 degré, Partie 4
Cet article présente les principales fonctionnalités apportées par LINQ to SQL
Par Kader Yildirim publié le 01/08/2007 à 19:29, lu 3923 fois, 7 pages
 6 | Correction et amélioration du code généré
Lors de notre analyse du code généré nous nous sommes rendu compte que dans le cas d'une procédure stockée retournant deux recordsets l'assistant créé une classe ne prenant en compte que l'un des deux cas. Pour palier ce défaut nous allons créer une classe partielle qui change l'appel à cette procédure stockée de la manière suivante :

public partial class EntrepriseDataContext : DataContext {

 

        [StoredProcedure(Name = "dbo.LireSiteEtAdresse")]

        public IMultipleResults LireSiteEtAdresse2()

        {

            return ExecuteMethodCallWithMultipleResults(this,

                        (MethodInfo)MethodInfo.GetCurrentMethod());

        }

    }

L'utilisation devient alors plus naturelle :

var q = edc.LireSiteEtAdresse2();

            foreach (Site s in q.GetResult<Site>())

                Console.WriteLine(s.AdresseID + " " + s.Code + " " + s.Nom);

 

            foreach (Adresse a in q.GetResult<Adresse>())

                Console.WriteLine(a.Ville + " " + a.Rue);

Le lien entre les tables Projet et TypeProjet peut être modélisé ainsi :
 
/content/99963165-48f8-4ea2-8ee1-cf36f376b8c7/Classes.PNG
 
Dans cet exemple on suppose que seuls les projets informatiques ont un programme afin de montrer quelques fonctionnalités supplémentaires de LINQ to SQL.

Avec le support de l'héritage ceci se traduit par :

[Table(Name="dbo.Projet")]

    [InheritanceMapping(Code = "DSI", Type = typeof(ProjetInformatique))]

    [InheritanceMapping(Code = "LGQ", Type = typeof(ProjetLogistique))]

    [InheritanceMapping(Code = "MKG", Type = typeof(ProjetMarketing))]

    [InheritanceMapping(Code = "ORG", Type = typeof(BaseProjet),IsDefault=true)]

    public class BaseProjet {

 

        [Column(IsPrimaryKey = true)]

        public int ProjetID;

        [Column]

        public string Nom;       

        [Column(IsDiscriminator = true)]

        public string CodeTypeProjet;       

        [Column]

        public int ChefDeProjetID;

    }

L'attribut InheritanceMapping indique, suivant un critère de différenciation (propriété Code) quelle classe utiliser (propriété Type). Pour connaître à quelle donnée de la classe la valeur précisée dans la propriété Code correspond, il suffit d'ajouter la propriété IsDiscriminator=true à l'attribut Column (dans notre cas CodeTypeProjet). La propriété IsDefault=true indique quelle classe utiliser si le discriminant ne correspond à aucune des valeurs précisées dans Code.

Ensuite il suffit de déclarer les classes héritées avec, s'il y a lieu, les colonnes qui leur sont spécifiques. Par exemple :

public class ProjetInformatique : BaseProjet {

        [Column]

        public string CodeProgramme;

    }

Vous noterez que pour les classes héritées l'attribut Table n'est plus nécessaire.

L'utilisation devient alors :

var q = edc.GetTable<BaseProjet>().OfType<ProjetInformatique>();

            foreach (BaseProjet p in q)

                Console.WriteLine(p.Nom + " " + p.CodeTypeProjet);

La requête générée ne ramène effectivement que les projets du type demandé :
 
/content/99963165-48f8-4ea2-8ee1-cf36f376b8c7/InheritanceReq.PNG
 
 
» Démarrer une discussion
 
Discussion démarée par Mitsuru Furuta le 08/08/2007 à 21:18, 1 commentaire(s).
Discussion démarée par ButhodS le 24/06/2008 à 10:55, 1 commentaire(s).
Discussion démarée par Matthieu Mezil le 08/08/2007 à 16:56, 1 commentaire(s).
Discussion démarée par Matthieu Mezil le 07/08/2007 à 17:37, 1 commentaire(s).
Discussion démarée par Matthieu Mezil le 06/08/2007 à 12:32, 2 commentaire(s).
Discussion démarée par steftanguy le 13/12/2007 à 23:00, 4 commentaire(s).