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 :

Problème clause Where sur une liste qui ne renvoi rien


Sujet :

Linq

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut Problème clause Where sur une liste qui ne renvoi rien
    Bonjour,

    Je vais essayer d'expliquer le mieux possible mon problème. J'ai une classe (qui est un UserControl en WPF) qui contient une liste d'objet d'une autre classe (un autre UserControl)

    Voici donc la liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     private List<SkillUserControl> listSkill;
    Bon la classe SkillUserControl contient plusieurs attribut, je vais juste en mentionner trois

    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
     
    public int Key
    {
    	get;
    	private set;
    }
     
    public int numPrereq
    {
    	get;
    	private set;
    }
     
    public SkillUserControl Prereq
    {
    	get;
    	internal set;
    }
    la propriété numPrereq est à -1 par défaut sinon ça veut dire que le Skill a un Skill parent et donc numPrereq contient la même valeur que la propriété Key du Skill parent (j'espère être assez clair...)

    Je fais un foreach sur la liste des Skill et si numPrereq != 1 je veux récupérer le SkillUserControl qui est le parent du skill actuel, voici mon linq:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach(SkillUserControl suc in listSkill)
    {
    	if(suc.numPrereq != -1)
    	{
    		suc.Prereq = listSkill.Where(s1 => s1.Key == suc.numPrereq).ToList().First();
    	}
    }
    Il me lance une Exception en me disant que la liste ne contient aucun élément (je parle du ToList()) alors que le skill que je veux récupérer existe j'ai fait un Console.WriteLine sur tous les Skill de listSkill et ils y sont tous.

    J'ai donc voulu juste afficher la clé sur skill parent plutôt que de l'affecter pour voir si cela faisait une différence, toujours la même exception la liste retournée est vide alors que ce n'est pas censé être le cas...

    Ca fait des heures que je suis bloqué dessus, et je ne trouve pas la raison de mon problème...

    Merci d'avance pour vos réponses

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2009
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 229
    Points : 305
    Points
    305
    Par défaut
    Pourquoi tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    suc.Prereq = listSkill.Where(s1 => s1.Key == suc.numPrereq).ToList().First();
    essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var MySucPrereq = listSkill.Where(s1 => s1.Key == suc.numPrereq).First();
    Accepter les critiques, c'est le premier pas pour être un bon développeur ...

  3. #3
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Pourquoi tu fais :
    Code :Sélectionner tout - Visualiser dans une fenêtre à part12
    var MySucPrereq = listSkill.Where(s1 => s1.Key == suc.numPrereq).First(); __________________
    Essayes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var MySucPrereq = listSkill.First(s1 => s1.Key == suc.numPrereq);
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Ceci dis la syntaxe n'y changera rien vous dites:
    la liste retournée est vide alors que ce n'est pas censé être le cas
    et pourtant elle est bien vide avec le prédicat appliqué dans le where...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Justement je cherche à savoir pourquoi il ne me renvoi rien...

    listSkill contient tous les Skill j'ai vérifié, chaque Skill a une propriété Key qui est un int, ainsi qu'une propriété numPrereq qui contient la Key du Skill parent si il en a un ou -1 sinon.

    Donc avant de faire mon linq je veux être sûr que le Skill ait un parent d'où le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (if suc.numPrereq != -1)
    A partir de là mon linq doit me retourner l'objet SkillUserControl qui correspond au parent du Skill actuel

  6. #6
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour.

    Je vois deux solutions :
    * Soit tu utilises une biblio qui reproduit Linq pour des versions du framework dotnet antérieures à Linq et il se peut qu'il y ait un bug dans cette biblio.
    * Soit ton prédicat est effectivement erroné et je t'engage à remplacer la requête linq par un bon vieux foreach pour t'assurer que tout fonctionne bien et, à défaut, pouvoir examiner avec le débogueur comment le prédicat se comporte avec chaque élément. Bref, une fonction GetFirst perso.

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Justement je cherche à savoir pourquoi il ne me renvoi rien...

    listSkill contient tous les Skill j'ai vérifié, chaque Skill a une propriété Key qui est un int, ainsi qu'une propriété numPrereq qui contient la Key du Skill parent si il en a un ou -1 sinon.

    Donc avant de faire mon linq je veux être sûr que le Skill ait un parent d'où le

    [code]
    (if suc.numPrereq != -1)
    [code]

    A partir de là mon linq doit me retourner l'objet SkillUserControl qui correspond au parent du Skill actuel
    Quand tu prends l'exception, que vaut key?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Je viens de tester ce code

    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
     
    foreach(SkillUserControl suc in listSkill)
    {
    	if(suc.numPrereq != -1)
    	{
    		foreach(SkillUserControl s in listSkill)
    		{
    			if(suc.numPrereq == s.Key)
    			{
    				suc.Prerequis = s;
    				Console.WriteLine(suc.Prerequis.Key);
    			}
    		}
    	}
    }
    Et je ne comprends plus rien, il ne m'affiche rien dans la console, il semblerait que suc.Prerequis soit null...

  9. #9
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Déjà, tu es bien en mode console ? Ensuite, je ne suis pas totalement sûr que les nulls causent l'affichage d'une chaîne vide mais, même si c'est le cas, ce serait suc.Prerequis.Key qui serait null, sinon il y aurait une NullReferenceException.

    A tout hasard, regarde la fenêtre output, elle a peut-être des infos supplémentaires.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Non je suis pas en mode console mais les Console.WriteLine s'affichent dans la fenêtre de sortie lors de l'exécution, et je n'ai rien, il ne rentre pas dans mon if et je ne comprends pas pourquoi vu qu'il existe bel et bien un skill qui est parent du skill actuel, et ils sont tous les deux dans la même liste

    EDIT: Bon après des heures à chercher pourquoi mon LINQ ne fonctionnait pas, je viens finalement de voir que chaque valeur de Key dans la liste de mes SkillUserControl est à 0, il va falloir que je regarde dans mes classes de sérialisation maintenant pour voir pourquoi

    Je suis désolé de vous avoir fait perdre votre temps...

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Bon après des heures à chercher pourquoi mon LINQ ne fonctionnait pas, je viens finalement de voir que chaque valeur de Key dans la liste de mes SkillUserControl est à 0, il va falloir que je regarde dans mes classes de sérialisation maintenant pour voir pourquoi
    C'est ballo

    Comment est alimentée listSkill? directement via une requêtes SQL?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Non par un fichier xml désérialisé, je récupère les informations et créer mes objets et les ajoute à ma liste, mon problème est résolu, et mon skill parent est bien affecté, encore désolé pour le temps perdu...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2010, 11h48
  2. [MySQL] Clause WHERE sur une liste et jeu de caractère
    Par napz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/10/2006, 13h03
  3. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56
  4. Réponses: 4
    Dernier message: 16/06/2005, 15h37
  5. probléme de cadre sur une image qui me sert de lien
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/11/2004, 17h36

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