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 :

Linq to SQL : relation 1,n


Sujet :

C#

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut Linq to SQL : relation 1,n
    Bonjour a tous,

    J'ai créer un base de données qui comprend 2 tables. Elles sont relier par une association 1,n - 1,n. Cela donc me créer une troisième table : Normal.

    ce qui donne :

    table 1 :
    idTb1
    nom

    table 2 :
    idTb2
    nom

    table 3 :
    idTb1
    idTb2


    J'ai ensuite utilisé SqlMetal pour me générer les classes correspondant a mes tables.

    Maintenant j'essaie de créer une requête par exemple qui me permet d'afficher tout les nom de la table 2 qui ont pour l'id = 1 de la table 1

    Mais je bloque, il m'affiche des résultat totalement improbable.

    Comment puis-je faire.

    Merci de votre aide.
    Life myLife = new Life ("eat","sleep","code");

  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
    Utilisons des exemples concrets.

    Nous avons des étudiants et des professeurs et des cours.

    Donc tu voudrais pouvoir sélectionner tous les étudiants d'un cours pour tel professeur ou tous les professeurs assignés à un tel étudiant.

    Si c'est bien cela, alors tu n'auras qu'à faire quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var etudiants = (from c in Cours join e in Etudiants on c.EtudiantID == e.EtudiantID where c.ProfesseurID== 1 select e).ToList();
     
    var professeurs = (from c in Cours join p in Professeurs on c.ProfesseurID == p.ProfesseurID where c.EtudiantID == 1 select p).ToList();

  3. #3
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Linq To SQL est deprecated comme disent nos amis anglais.
    Vaut mieux passer par Entities Framework.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Tout d'abord merci pour vos réponse.

    @GuruuMeditation je crois que je suis obligé de passer par Linq To Sql car je développe sous WP.

    @Babyneedle Oui tu as raison parlons concrètement :

    Voici mon MLD :



    Mes contraintes de modélisations sont les suivantes :

    - un plat peut être accompagner de plusieurs vin.
    - un vin peut accompagner plusieurs plat.


    Par exemple : Obtenir tout les vins qui corresponde au plat suivant : ( id = 1, nom = blanquette )

    J'ai tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (NavigationContext.QueryString.TryGetValue("idPlat", out query))
                 {
                     int idplat = int.Parse(query);
     
                            listvin =   from Vin vin in context.Vins
                                   from AccompVinPlat accomp in context.AccompVinPlats 
                                        where accomp.IdPlat == idplat
                                        select vin;
                            ListVin = new ObservableCollection<Vin>(listvin);
     
    }
    J'ai une page ou je liste tout mes plats, lors du click sur cette liste, je récupére l'id du plat dans un queryString et l'utilise dans le where de ma requête.

    Seul problème, il me retourne tout les vins et même créer des doublons.

    Merci a vous pour votre aide.
    Life myLife = new Life ("eat","sleep","code");

  5. #5
    Membre actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    Par défaut
    Bonjour,

    Le résultat me semble normal. En effet, dans ta requête, tu ne spécifies aucun lien entre les vins et les plats. Du coup, il prend chaque vins, chaque plat, et fait une association.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (NavigationContext.QueryString.TryGetValue("idPlat", out query))
    {
       int idplat = int.Parse(query);
     
       listvin =   from Vin vin in context.Vins
                   from AccompVinPlat accomp in context.AccompVinPlats 
                            where accomp.IdPlat == idplat &&
                                     accomp.IdVin == vin.id
                   select vin;
       ListVin = new ObservableCollection<Vin>(listvin);
     
    }
    Ou avec une jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (NavigationContext.QueryString.TryGetValue("idPlat", out query))
    {
       int idplat = int.Parse(query);
     
       listvin =   from Vin vin in context.Vins
                   join AccompVinPlat accomp in context.AccompVinPlats on accomp.IdVin equals vin.id
                           where accomp.IdPlat == idplat
                   select vin;
       ListVin = new ObservableCollection<Vin>(listvin);
     
    }

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Sacré "&&"

    J'avais essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    listvin =   from Vin vin in context.Vins
                   from AccompVinPlat accomp in context.AccompVinPlats 
                            where accomp.IdPlat == idplat AND
                                     accomp.IdVin == vin.id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    listvin =   from Vin vin in context.Vins
                   from AccompVinPlat accomp in context.AccompVinPlats 
                            where accomp.IdPlat == idplat
                            where accomp.IdVin == vin.id
    J'étais en mode SQL et non en mode C#

    Bien sur aucun des deux code ne marchais. Je m'étais donc dit que plusieurs conditions dans le where était impossible en Linq To Sql.

    Un grand merci ElTotor pour ton aide.

    je suis enfin débloqué, problème résolu
    Life myLife = new Life ("eat","sleep","code");

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

Discussions similaires

  1. [Linq to sql] db.add() ?
    Par telynette dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/02/2008, 19h54
  2. [Linq to SQL] Refresh du dbml
    Par zeavan dans le forum Visual Studio
    Réponses: 5
    Dernier message: 02/01/2008, 10h15
  3. [SQL] Relation entre deux menus déroulants dynamiques
    Par intissar_g dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/11/2007, 15h36
  4. [SQL] Relations complexes entre deux tables
    Par simonoche dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/06/2007, 00h23
  5. Requête SQL ( relation does not exist)
    Par norvel dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 25/10/2005, 17h29

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