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

C# Discussion :

foreach / trois tables [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut foreach / trois tables
    bonjour,

    Etant donné que cela relève plus du code c# que de la connexion EF je post ici.

    Donc j'ai une table entreprise et d'une table dirigeant. Une entreprise peut avoir plusieurs dirigeant et un dirigeant plusieurs entreprise.
    Je doit afficher la liste des dirigeants d'une entreprise sélectionner.

    Voici mes étapes :

    - Je fait une boucle pour récupéré les informations sur l'entreprise sélectionner.
    - Je parcoure chacun des dirigeants, puis je parcoure chacune de leurs entreprises (c.ENTREPRISE), et si cette entreprise est égale a l'entreprise sélectionner je l'ajoute.

    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
    entreprise monEnt = new entreprise();
     
    foreach (entreprise uneE in _cad.entreprise)
    {
      if (uneE.numEnt == idEnt)
      {
        monEnt = uneE;
      }
    }
     
    foreach(dirigeant d in _cad.dirigeant)
    {
      foreach (entreprise e in d.entreprise)
      {
        if(e.entreprise == monEnt)
        {
          _listeDir.add(d);
        }
      }
    }
    L'erreur provient de la ligne 13, mais que faut-il changer ? :/

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Aucun besoin de faire des foreach. Si tu utilises déjà Entity Framework, utilises plutôt Linq.

    Ça devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from de in _cad.dirigeants_entreprises
    		    join d in _cad.dirigeants on de.dirigeant_ID equals d.ID
                        join e in _cad.entreprises on de.entreprise.ID equals e.ID
                        where e.Name = "Mon entreprise"
    		    select d.Name;

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Bonjour et merci d'avoir pris le temps de me répondre,

    Pourriez vous m'expliquer ces quelques lignes.

    A quoi correspond dirigeants_entreprises lignes 2 ?
    _cad.dirigeants d'accord mais le _entreprises a la suites .


    Et pour la jointure, je n'ai pas dans entreprises d'id dirigeants, comme il n'y a pas d'id entreprises dans dirigeants. Mais si j'ai bien compris, une collection d'entreprises dans dirigeants et une collection de dirigeants dans entreprises.

    Désolé je n'ai jamais utilisé le Link, pour le moment.

  4. #4
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello,

    Tout d'abord, si tu veux avoir une réponse qui corresponde à ton problème, merci de mettre le message d'erreur complet et non pas juste "ça marche pas" (je caricature à peine )

    Ensuite, comme le suggère Babyneedle, utilise linq pour ta requête. Je serais même plus catégorique : n'utilise SURTOUT pas de boucles foreach ! En effet, je parle de "requête", car EntityFramework transforme les lignes de code C# en lignes de code SQL. Le code que tu proposes va générer un nombre non négligeable de requêtes SQL et les envoyer au serveur SQL, et ça proportionnellement au nombre d'entreprises et de dirigeants dans la base. Carrément pas bon !

    Si tu veux utiliser EF, il faut que tu te mettes au langage Linq Tu remarqueras que c'est assez proche du langage SQL.

    Voici ma proposition de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IEnumerable<dirigeant> = 
        (from dir in this._cad.dirigeant
        where dir.entreprise.Any(x => x.numEnt == idEnt)
        select dir).ToList();
    Ce qui signifie : je recherche tous les dirigeants qui sont liés à l'entreprise d'id idEnt.
    Le ToList() à la fin, c'est pour envoyer la requête au serveur SQL : cet envoi se fait uniquement au moment où on a besoin de connaitre la liste des dirigeants telle que définie, j'aime autant avoir la main dessus et imposer cet envoi de requête.

    A noter : si tu t'es dit, "je vais utiliser EntityFramework, comme ça pas besoin de m'y connaitre en SQL", c'est un mauvais calcul : les bons utilisateurs EF sont ceux qui connaissent bien les BDD et SQL...
    "C'est tellement merdique que toute modification est une amélioration !"

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Bonjour,

    Citation Envoyé par plume13 Voir le message
    Hello,

    Tout d'abord, si tu veux avoir une réponse qui corresponde à ton problème, merci de mettre le message d'erreur complet et non pas juste "ça marche pas" (je caricature à peine )

    Ensuite, comme le suggère Babyneedle, utilise linq pour ta requête. Je serais même plus catégorique : n'utilise SURTOUT pas de boucles foreach ! En effet, je parle de "requête", car EntityFramework transforme les lignes de code C# en lignes de code SQL. Le code que tu proposes va générer un nombre non négligeable de requêtes SQL et les envoyer au serveur SQL, et ça proportionnellement au nombre d'entreprises et de dirigeants dans la base. Carrément pas bon !

    Si tu veux utiliser EF, il faut que tu te mettes au langage Linq Tu remarqueras que c'est assez proche du langage SQL.

    Voici ma proposition de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IEnumerable<dirigeant> = 
        (from dir in this._cad.dirigeant
        where dir.entreprise.Any(x => x.numEnt == idEnt)
        select dir).ToList();
    Ce qui signifie : je recherche tous les dirigeants qui sont liés à l'entreprise d'id idEnt.
    Le ToList() à la fin, c'est pour envoyer la requête au serveur SQL : cet envoi se fait uniquement au moment où on a besoin de connaitre la liste des dirigeants telle que définie, j'aime autant avoir la main dessus et imposer cet envoi de requête.

    A noter : si tu t'es dit, "je vais utiliser EntityFramework, comme ça pas besoin de m'y connaitre en SQL", c'est un mauvais calcul : les bons utilisateurs EF sont ceux qui connaissent bien les BDD et SQL...
    Merci d'avoir pris le temps de me répondre

    Cela fonctionne parfaitement et va m’être très utile pour la suite.

    J'ai quelques bonnes base en SQL, donc je vais suivre vos conseils et me lettre au Link, auriez vous un bon cours a me recommandé sous la main ?

    Cordialement, Alexandre.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Juste une précision c'est LinQ avec un "q"

    Ce n'est pas un tuto mais une centaine d'exemples :
    101-LINQ-Samples

    Pour les tutos :
    Tutos

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PostgreSQL] (Requête sur trois tables)
    Par nils56 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/05/2006, 13h50
  2. [VB6] Requete sur Trois Tables
    Par ayouss dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/05/2006, 15h09
  3. [debutant]problematique entre trois tables
    Par djodjo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/08/2005, 15h21
  4. requete entre trois tables
    Par fpouget dans le forum Langage SQL
    Réponses: 8
    Dernier message: 08/03/2005, 21h44
  5. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20

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