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 :

Liste dans le where d'une requete LinQ dynamic


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut Liste dans le where d'une requete LinQ dynamic
    Bonsoir,
    Voila petite question, Y'a t'il un moyen dans le where d'une requete LinQ dynamic d'introduire une liste d'argument ?
    Par exemple j'ai la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    using (var db = new DiagEntities())
                    {
                        //requete sur la table LesQuestion
                        var Toute_question = from p in db.LesQuestions
                                                     where p.QuestionID !=1 && p.QuestionID !=5  // élimine la ligne 1 et 5 de la table                                  
                                                     select p;
     
    // affichage de la table
    Rita1.DataSource = Toute_question.ToList();
    Rita1.DataBind();
    J'aimerais utiliser cette requete dans une boucle et ajouter a chaque passage (après traitement ) un "p.QuestionID !=XXX" à mon where.

    je pense faire donc quelques chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var Lewhere=p.QuestionID !=1 && p.QuestionID !=5 && ....   
    var Toute_question = from p in db.LesQuestions
                                 where (Lewhere)                                  
                                 select p;
    je me demande 2 choses:
    -Est-ce que c'est le meilleur moyen d'ajouter des clauses à un where parce que ça fait un peu bidouillage cette longue liste d'argument...
    - Si ça se fait je pensais utiliser un dictionnaire pour ajouter mes clauses une par une a chaque iteration puis le transformer en une seul ligne de code. Vous en pensez quoi ?

    merci de votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2012
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 80
    Points : 163
    Points
    163
    Par défaut
    Je en vois pas l'interet du : var Lewhere=p.QuestionID !=1 && p.QuestionID !=5 && ....

    le plus simple est de faire un tableau d'int où tu mets tes numéros de question. Puis de regarder si le tableau contient la valeur.

  3. #3
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    L’intérêt du truc tu sais....

    edit: tu as raison. je me casse la nenete pour pas grand chose, c'est une liste de clé .
    Je requete la liste complete, je la passe en list() je degage celle qui me va pas et je travail dessus .

    merci pour ton aide .

    Je mettrai résolu quant j'aurais trouvé le moyen d'automatiser le remove

  4. #4
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    j'ai un nouveau problème cette fois ci de "logique" sur les ensembles.

    j'ai une table avec 3 colonnes (iD, ReponseSEQ, QuestionSEQ). Elles sont toute de type int.
    La colonne ReponsesSEQ peut contenir plusieurs fois la même valeur et la colonne QuestionSEQ également.
    En revanche chaque couple ReponseSEQ/QuestionSEQ est unique et correspond à un VRAI. Si la relation est FAUX le couple n'existe pas dans la table.

    ex: Question: "est-elle bleu ?" Réponse: "la mer", le couple "la mer"/ "est-elle bleu?" est VRAI et le couple existe donc dans la table
    ex: Question: "est-elle petit?" Réponse: "Une baleine", le couple "Une baleine"/"est-elle petit?" est FAUX et n'existe donc pas dans ma table.

    Très simplement, a chaque fois que mon algo me fournit une question et sa réponse "Oui ou non" je souhaite filtré ma table et créer une liste comprenant mes 3 colonnes avec uniquement les couples pour lesquelles la relation se vérifie.

    Je créer donc une liste a partir de ma table SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var Toute_question = (from p in db.Jonctabs
                                   select p).ToList();
    si le couple Question/Reponse est vrai alors je cherche dans ma liste toute les Réponse qui vérifie bien cette égalité (le couple reponse/question est présent)
    je procède donc ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var Question_Rest = (from v in db.Jonctabs
                                  where (v.QuestionSEQ == pkey)   // pkey = La Question fournis par l'algo
                                  select v.ReponseSEQ).ToList();
    j'obtient une liste avec toute les réponses possible . Mon problème est que je n'arrive pas injecter automatiquement ses réponses dans ma table pour obtenir une liste de tous les couples encore possible. Manuellement il suffit de faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var Onregarde = from p in Toute_question
                           where p.ReponseSEQ == 1 || p.ReponseSEQ == 4 || p.ReponseSEQ == 7 || p.ReponseSEQ == 18
                           select p;
    Hors cette ligne : "p.ReponseSEQ == 1 || p.ReponseSEQ == 4 || p.ReponseSEQ == 7 || p.ReponseSEQ == 18" correspond a ce qui se trouve dans ma liste de réponse. Je l'ai écrite connaissant les réponses (ici 1,4,7 et 18) mais cela varira à chaque fois que l'algo m'enverra une Question.

    J'ai essayer de décomposer le problème au maximum car je n'arrrive par a faire un tri dans une liste quant il y'a plusieurs fois la même valeur dans une colonne .
    la clause where v.QuestionSEQ == pkey ou v.QuestionSEQ != pkey est excluant d'une façon stricte, il ne renvoi que les ligne ou la Question existe dans la colonne QuestionSEQ. Or j'ai besoin de garder ces ligne ET celle ou la réponse n'ayant pas été élimine il me faut conserver les couple question/Reponses.

    Désolé si c'est pas très claire. Si vous avez une piste

  5. #5
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    une tentative intéressante
    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
     
    // selectionne dans cette liste les Reponse si Question = oui
            var Question_Rest = (from v in db.Jonctabs
             where (v.QuestionSEQ == pkey) 
             select v.ReponseSEQ).ToList();
     
    // Sous la forme Lambda
    //var Question_Rest = Toute_question.Where(c => c.QuestionSEQ == pkey);
     
       for (int i =0; i<Question_Rest.Count; i++)
                      {
                       var touduo =  from p in Toute_question
                                           let item = Question_Rest[i]
                                           where p.ReponseSEQ == item
                                           select p;
                     }
    mais je ne recupere qu'une liste avec le dernier p.ReponseSEQ == 18

  6. #6
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    il falait une jointure !
    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
     
    /creer une liste de toute les question dans la table LesQuestion
                            var Toute_question = (from p in db.Jonctabs
                                                  select p).ToList();
     
                            // selectionne dans cette liste les Reponse si Question = oui
                            var Question_Rest = (from v in db.Jonctabs
                                                 where (v.QuestionSEQ == pkey)
                                                 select v).ToList();
     
                            // jointure entre toute les réponses restantes et les questions potentielles
                            var ToulesCouple = from p in Toute_question
                                               join v in Question_Rest
                                               on p.ReponseSEQ equals v.ReponseSEQ
                                               select p;
    bon par contre l'inverse ne fonctionne pas
    le (v.QuestionSEQ != pkey) cumul les 2 j'ai l'impression...

  7. #7
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    Pas sur site donc je ne posterai pas la réponse pour le false mais c'est dans le même genre. Il faut jongler avec les methodes d'union, intersection, exclusion en plus des jointure pour pouvoir travailler avec des ensemble du type A = (Total -B). Une fois qu'on sait qu'ils existent ça va tous seul

    merci a tous pour votre aide

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/04/2015, 17h30
  2. impossible d'afficher le resultat d'une requete "Linq to" dans un datagrid
    Par zouuc dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 19/10/2010, 15h44
  3. Réponses: 1
    Dernier message: 22/12/2009, 20h05
  4. erreur dans l'execution d'une requete
    Par marsupilami34 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/09/2005, 16h47
  5. Réponses: 9
    Dernier message: 05/07/2005, 08h37

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