IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

recuperer des données dans un format autre que anonyme


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut recuperer des données dans un format autre que anonyme
    salut a tous!
    J'ai 4 table dans ma BD: "personne", "adresses", "parc_etude", "parc_prof". je veux lire les données des 4 tables pour chaque personne. Donc je doit faire une jointure sur eux suivant le id de chaque personne. j'ai ecrit ce bout de code et il est fonctionnel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    internal ObjectResult Chercher()
             {  
     
                X23Pctx = new X23PEntities();
     
                var personneQuery = from Pers in X23Pctx.personnes
                                    from Etud in X23Pctx.etudes
                                    from ParProf in X23Pctx.parc_prof
                                    from Adr in X23Pctx.Adresses
                                    where Pers.id == Adr.id_personne
                                    where Pers.id == Etud.id_personne
                                    where Pers.id == ParProf.id_personne
                                    orderby Pers.id
                                    select new
                                        {
                                            Pers.id, Pers.nom, Pers.prenom, Pers.email, Pers.Tel,
                                            Adr.gouvernorat, Adr.ville, Adr.cite, Adr.rue, Adr.num
                                            Etud.ecole, Etud.specialite, Etud.debut, Etud.fin, Etud.resume,
                                            ParProf.etablissement, Deb = ParProf.debut,  Fin = ParProf.fin, ParProf.motif_depart
                                        };
     
                var ss =  ((ObjectQuery)personneQuery).Execute(MergeOption.AppendOnly);
    Et j'affiche dans un Datagrid avec setautocolumn"true".

    Mais le probléme est que le format de chaque ligne dans la Collection est du type Anonyme!!!
    Donc si je recupere l'element selectionnné avec "datagrid.selecteditem"
    Il me dit que c'est un objet de type anonyme. Donc je peut rien recuperer!!!

    J'ai essayer ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     var CVQuery = (from  Pers in Personnes
     
                                    join Adr in Adresses
                                    on Pers.id equals Adr.id_personne
                                    orderby Pers.id
                                    select new
                                        {
                                            Pers.id, Pers.nom, Pers.prenom, Pers.email, Pers.Tel,
                                            Adr.gouvernorat, Adr.ville, Adr.cite, Adr.rue, Adr.num,
                                           // Etud.ecole, Etud.specialite, Etud.debut, Etud.fin, Etud.resume,
                                           // ParProf.etablissement, Deb = ParProf.debut,  Fin = ParProf.fin, ParProf.motif_depart
                                        });
    Mais il peut pas joindre plus que 2 table!!!
    Avez vous une idée comment recuperer la liste des personnes avec tout leurs données issuent des 4 tables mais dans un format autre que anonyme.
    ou comment recuperer les données d'un objet de type anonyme.
    Le but final est que j'affiche la liste des personnes dans une vue d'une region 1, et afficher une ligne dans une autre vue dans une autre region. et ç'est la personne selectionnée dans le 1er datagrid?
    je suis perdue depuis 1 mois sans solution!!!

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Créer un type ou une structure qui contient tous les champs qu'il te faut puis dans ton select tu fais un Select(i=> new MyStruct{ MyProp1= i.bla ...})

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut
    J'ai envisagé cette solution mais elle implique la reproduction du schema entier du edmx!!
    Pour cela je la garde a la fin.
    En plus cela me rapple combien Java est meilleur car il expose les table dans des classes parfaite et on utilise le JPU pour les operation de CRUD!! et chaque collection d'ojet est lier un aun autre via le "@many to one". Y a pas un equivalent dans le entity framework??
    Est ce que c'est possible de recuperer la valeur de l'id de la prsonne selectionné depuis son objet anonyme ( via le Datagrid SelectedItem)? Puis je me reconnecte a la BD et je recupere ses données?

  4. #4
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut
    p { id = 2, nom = "gh", prenom = "ml ", email = "ml.dd@hotmail.fr", Tel = "78451245", gouvernorat = "tunis", ville = "ariana", cite = "farhat", rue = "rien", num = "78" ... } <Anonymous Type>
    Voici le contenue d'un objet P de type anonyme aprés avoir été selectionnée dans le datagrid.
    Y'a t il un moyen pour recuperer les données?!! aumois la valeur de l'id???

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Arctodus Voir le message
    J'ai envisagé cette solution mais elle implique la reproduction du schema entier du edmx!!
    Pour cela je la garde a la fin.
    En plus cela me rapple combien Java est meilleur car il expose les table dans des classes parfaite et on utilise le JPU pour les operation de CRUD!! et chaque collection d'ojet est lier un aun autre via le "@many to one". Y a pas un equivalent dans le entity framework??
    Est ce que c'est possible de recuperer la valeur de l'id de la prsonne selectionné depuis son objet anonyme ( via le Datagrid SelectedItem)? Puis je me reconnecte a la BD et je recupere ses données?
    Faut pas dire que Java est meilleur quand on sait pas le faire en .Net

    Tout dépend de comment t'as fait ton modèle edmx.
    Si il est bien fait, il a des propriétés de navigation dans ton objets crées. Tu peux notamment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    X23Pctx = new X23PEntities();
    var personnes = X23PEntities.personnes.Include("adresse").Include("etude").OrderBy(p=>p.id);
     
    foreach(var personne in personnes)
    {
        var name = personne.nom;
        var city = personne.adresse.ville;
        var school = personne.etude.ecole;
    }
    Bon ca reste à retravailler car j'ai pas ton schéma sous la main mais dans l'idée c'est ca!

  6. #6
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut
    merci PitMaverick78
    Peut on le faire avec les 4 tables, le include???
    pour les propriete de navigations, je retrouve des colonne avec leurs noms mais elles sont vides!!!
    est il possible de recuperer aussi les champs des autres tables dans la meme ligne??
    et le id dans une variable de type int ou string??
    Je remarque aussi que les données recuperer sont tjrs au format VAR!! donc anonyme!!!
    En essayant de taper ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var city = personne.adresse.ville;
    quand j'arrive a ce niveau "var city = personne.adresse." il ne m'expose pas les champs de la collection adresses!!!! Donc pas de "ville" ni "rue" ni rien du tout sauf les extension et les methode standard d'une collection ou une list

  7. #7
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Citation Envoyé par Arctodus Voir le message
    Peut on le faire avec les 4 tables, le include???
    pour les propriete de navigations, je retrouve des colonne avec leurs noms mais elles sont vides!!!
    Autant que tu veux, cela fait juste une jointure à chaque fois ... Il faut faire attention car le nombre de jointure peut augmenter le nombre de résultats qui vienne de la base...
    Citation Envoyé par Arctodus Voir le message
    est il possible de recuperer aussi les champs des autres tables dans la meme ligne??
    C'est ce que fais l'include
    Citation Envoyé par Arctodus Voir le message
    et le id dans une variable de type int ou string??
    Récupère le dans ton entité Personne
    Citation Envoyé par Arctodus Voir le message
    Je remarque aussi que les données recuperer sont tjrs au format VAR!! donc anonyme!!!
    var n'est pas un type anonyme, c'est une déclaration de type automatique, détécté par le compilateur

    en gros quand on fait :

    x n'est pas de type anonyme mais de type "string"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var x = new { Tata = "toto" };
    La x est d'un type anonyme ayant une propriété "Tata".

    Entity framework est un framework très puissant mais qui pour être bien utilisé nécessite une certaine maîtrise du framework et de .Net en général ... Peut être devrais tu potasser un peu avant de te lancer la dedans

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par Arctodus Voir le message
    merci PitMaverick78
    Peut on le faire avec les 4 tables, le include???
    pour les propriete de navigations, je retrouve des colonne avec leurs noms mais elles sont vides!!!
    est il possible de recuperer aussi les champs des autres tables dans la meme ligne??
    et le id dans une variable de type int ou string??
    Je remarque aussi que les données recuperer sont tjrs au format VAR!! donc anonyme!!!
    En essayant de taper ça:
    var city = personne.adresse.ville;
    quand j'arrive a ce niveau "var city = personne.adresse." il ne m'expose pas les champs de la collection adresses!!!! Donc pas de "ville" ni "rue" ni rien du tout sauf les extension et les methode standard d'une collection ou une list
    Dans ton edmx les tables as tu importés les Foreign Keys? Les liaisons entre tables sont elles modélisées?

  9. #9
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Citation Envoyé par Arctodus Voir le message
    J'ai envisagé cette solution mais elle implique la reproduction du schema entier du edmx!!
    Les structure serve si tu veux alléger (ou agréger/unifier) le modèle objet et le transférer vers d autres couches, à priori ce n'est pas ton cas

    Citation Envoyé par Arctodus Voir le message
    En plus cela me rapple combien Java est meilleur car il expose les table dans des classes parfaite et on utilise le JPU pour les operation de CRUD!! et chaque collection d'ojet est lier un aun autre via le "@many to one". Y a pas un equivalent dans le entity framework??
    Est ce que c'est possible de recuperer la valeur de l'id de la prsonne selectionné depuis son objet anonyme ( via le Datagrid SelectedItem)? Puis je me reconnecte a la BD et je recupere ses données?
    Déjà pour juger une techno il faut peut être savoir l'utiliser ...
    Ensuite j'aimerais bien savoir ce que 'est un "objet parfait" à tes yeux ? Si tu pense à un "POJO" ça n'a rien de parfait c'est juste un objet simpliste et cela existe aussi dans entity framework (cela s'appelle des POCO).
    Bien sur que si les collections sont liés ... Elle sont lié au sens objet via des EntityCollection<> si tu utilise des EntityObject et des ICollection<> si tu utilises des POCO.
    Ces propriétés sont appellé des navigation properties et son manipulables de façon assez riche (on peut changer leur status, les attacher, detacher, etc).

    Ce que tu as essayer de faire c'est de faire du SQL au lieu de récupérer des entité via du linq.
    Il faut que tu récupère des entités personne que tu bind dans ta gris et tu auras ensuite ton champs Id.

    En gros un simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    internal IEnumerable<Personne> Chercher()
    {
    X23Pctx = new X23PEntities();
    return X23PEntities.personnes.Include("Adresse").Include("Etude").OrderBy(p => p.id).ToList();
    }
    Devrait suffire.

    Au fait il faudrait passer un coup sur ton edmx et mettre des majuscule sur tes noms de classe et propriétés

    EDIT : grillé

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/02/2008, 15h46
  2. [Conception] Recuperer des données dans un tableau dynamique
    Par Tartanjet dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/09/2006, 00h28
  3. Réponses: 11
    Dernier message: 01/08/2006, 05h15
  4. Réponses: 9
    Dernier message: 25/07/2006, 19h05
  5. Réponses: 3
    Dernier message: 22/02/2004, 20h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo