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 :

Impossible de convertir implicitement le type 'System.Linq.IQueryable<int?>' en 'int'


Sujet :

Linq

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut Impossible de convertir implicitement le type 'System.Linq.IQueryable<int?>' en 'int'
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            public List<string> getParent()
            {
                DataClasses2DataContext dc1 = new DataClasses2DataContext();
                var AllParents = (from parents in dc1.ECMTermSetMembership orderby parents.ParentTermId select parents.ParentTermId).Distinct();
                DataClasses1DataContext dc2 = new DataClasses1DataContext();
                var AllLabels = (from labels in dc2.ECMTermLabel orderby labels.Label where labels.TermId = AllParents select labels.Label);
                return AllLabels.ToList();
            }
    ParentTermId est un int (mais il detecte celui ci comme int?) du coup j'ai cette erreur :
    Impossible de convertir implicitement le type 'System.Linq.IQueryable<int?>' en 'int'
    Je suis plutot dans l'embarras, car en faite, j'voulais faire sa en 2 requete, mais je n'arrive pas a comprendre le LINQ, il fait un for each implicite ? Car part exemple lors d'une requete si je veux recuperer chaque champ un par un a la suite je peux ou pas ? (par exemple dans ma table X avec 1,2,3 dedans, ma table Y avec pomme, fraise, banane, et je veux recuperer 1, le correspondre avec fraise et mettre banane dans une liste, puis ensuite faire avec 2 etc, comme en VB en somme)

    Je sais que sa fait 2 question, mais je voulais savoir.

    Merci d'avance pour vos reponses c'est gentil.

  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 : 38
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Alors effectivement derrière LINQ-to-Objects, y'a plein de foreach.
    Cependant toi tu es entrain de faire du Linq-to-Entities, il faut bien comprendre que derriere il y'a des requêtes SQL. Or ce que tu demandes en SQL est impossible (un nombre = un ensemble de ligne ne signifie rien).
    Tu peux passer par un Contains() qui sera traduit en un IN

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Merci pour cette eclaircissement =)

    Par contre meme sans passer pas tout cela, juste avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public List<int> getParent()
            {
                DataClasses2DataContext dc1 = new DataClasses2DataContext();
                var AllParents = (from parents in dc1.ECMTermSetMembership orderby parents.ParentTermId select parents.ParentTermId).Distinct();
                return AllParents.toList();
            }
    il me met toujours mon erreur sur le AllParents.toList();
    Impossible de convertir implicitement le type 'System.Linq.IQueryable<int?>' en 'int'
    quand je passe ma souris sur le parents.ParentTermId il detecte comme int? et non int, comment cela se fait-il ? Comment je peux changer ca ? j'ai regarder la definition de la table on peux mettre NULL c'est a cause de sa ? comment je peux recuperer cette liste de chiffre ?

    Car je suis sur des bases de données metagerée en SharePoint 2010 et il se trouve que dans une table on a les numeros et les label dans une autre. Donc je voudrais recuperer cette liste de numero, et aprés je pense pouvoir facilement parcourir une table pour recuperer le label non ? (il doit bien y avoir un equivalent a ExecuteScalar en LINQ ?

    Desoler de toute ces question hein ... mais projet de stage dans un language que je ne comprend pas, mes maitres de stages ne connaissent pas non plus mais on trouver la technologie silverlight interessante.

    Sinon il y a moyen en Silverlight de faire de la requete a l'ancienne ? (language SQL, avec un curseur qui se deroule, recuperer objet par objet etc ?)

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Si colonne nullable, alors ton type sera Nullable<T> pour les types valeurs, et donc ton int devient un int?...

    Deux solutions :
    - retourner une List<int?>
    - modifier ton return de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return AllParents.Where(i => i.HasValue).Select(i => i.Value).toList();
    Le Where est là pour éviter les valeurs null, sinon boum exception lors du select.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Oh merci sa fonctionne parfaitement !!!

    Je n'est pas vraiment compris la demarche du where ... .select, mais ca fonctionne, si tu peux m'expliquer vite fait (si cela ne te prend pas trop de temps) ca serais parfait.

    J'avais essayer de retourner un <int?> mais sa ne fonctionnais pas.

    Dans l'ensemble je trouve que Silverlight est compliquer comme language, pas simple d'accés pour un BTS n'ayant fait que du VB et du Java, pas beaucoup d'intellisence, et sensible a la casse.

    Et sinon (toujours si ca ne derange pas), je peux parcourir comme en VB avec un curseur une reponse de LINQ ? ou bien il ne peux renvoyer que des listes ? (j'ai trouver que des exemples avec des listes c'est pour sa ^^)

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Tu peux manipuler des tableaux, des dictionnaires... La list est la plus commune et donc la plus répandue... Par contre comme ça aucune collection reposant avec un curseur ne me vient.

    Pour le where...select : on peut transformer un int? en int, le select permet de récupérer ce int via la propriété Value sur ton int?.

    Mais comme int? peut être null, on vérifie juste avant avec where qu'il ne l'est pas (avec hasValue), sinon, si tu récupère un id null, exception lors du select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int? i = 1;
    bool b = i2.HasValue; // renvoie true
    int j = i2.Value; //affecte la valeur 1 à j
     
    int? i2 = null;
    bool b2 = i2.HasValue; // renvoie false
    int j2 = i2.Value; //lève une exception car null
    Le where permet donc de filtrer sur des données saines et le select de récupérer els donénes qui t'intéressent !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Ah ! OK !!! merci beaucoup pour ton explication, je viens de comprendre le HasValue, j'avais pas du tout tilter le "possede une valeur" desoler =) en tout cas c'est clair c'est cool !!!

    Parcourir comme par exemple ici (en VB c'est un ancien projet mais je voudrais faire le meme genre) :

    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
    'requete pour recuperer le numero de salarie'
            strSqlNumSalarie = "SELECT num_sal FROM SALARIES WHERE nom_sal='" + Nom() + "' and pre_sal='" + Prenom() + "'"
            objCommNumSalarie = New OleDbCommand(strSqlNumSalarie, objConnex)
            'requete pour remplir le tableau'
            strSqlTableau = "SELECT * FROM ABSENCES WHERE num_sal=" + CStr(objCommNumSalarie.ExecuteScalar) + " and va1_abs=false or va2_abs=false or va3_abs=false or va4_abs=false"
            objCommTableau = New OleDbCommand(strSqlTableau, objConnex)
            objDR = objCommTableau.ExecuteReader()
            SqlCode = objDR.Read()
            While SqlCode
                'requete pour recuperer le libellé du motif'
                strSqlLibMotif = "SELECT lib_mot FROM MOTIFS WHERE num_mot=" + CStr(objDR.Item(1))
                objCommLibMotif = New OleDbCommand(strSqlLibMotif, objConnex)
                dgvVisualiser.Rows.Add(objDR.Item(0), objCommLibMotif.ExecuteScalar, CStr(objDR.Item(8)), objDR.Item(2), objDR.Item(3), CStr(objDR.Item(4)), CStr(objDR.Item(6)))
                SqlCode = objDR.Read()
            End While
            objDR.Close()
    ici je recupere le numero de salarié a partir d'un nom et d'un prenom dans une table SALARIE, et ensuite avec ce numero j'vais chercher dans une table MOTIFS, bon je sais pas si c'est trés clair sur cette exemple mais bon.

    Ce que je voudrais faire ici, c'est tout simplement parcourir ma liste (que j'ai reussi a avoir avec la requete sur laquel tu ma aider pour le return) et grace au chiffre de cette liste taper dans une table ECMTermLabel afin de recuperer les labels et les afficher dans une liste deroulante.

    Car a la base j'aurais voulu le faire dans un seul "get" mais je sais pas si c'est possible, comme sa me retourne directement une liste de label (ce que je voudrais) afin de remplir facilement ma listbox. Je suis clair ou c'est confus :s

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Tu fais d'abord du entity, et ensuite de l'ado classique ? J'avoue ne pas suivre...

    tu veux faire une requête sql par valeur dans ta liste ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Alors pour t'expliquer ... je ne connais ni entity ni ADO.

    Je suis en seconde année de BTS, et je ne connais que le classique SQL fetch etc

    Ce que je t'es mit en VB est tout mon savoir en SQL (presque ^^) donc je suis plutot requete SQL basique etc.

    Je voudrais pouvoir faire en c# silverlight ce que j'arrive a faire simplement en VB (ce que je t'es citer est un projet VB classique).

    Tout simplement recuperer les chiffres qui m'interesse, grace a ces chiffres recuperer les labels qui m'interesse, et inclure ces labels dans une listbox.

    Je voulais donc savoir si il est possible en LINQ de faire du ligne par ligne, en incremental (for each) afin de remplir facilement.

    Exemple
    Premier passage
    chiffre recupere 2
    grace au 2
    label recupere Francais
    ListeLabel recupere Francais

    Seconde passage
    chiffre recupere 4
    grace au 4
    label recupere Electrotechnique
    ListeLabel recupere Electrotechnique

    [...]
    Fin de la boucle
    ListeLabel contien Francais, Electrotechnique,[...]

    Cela parais basique mais avec ce nouvelle environnement, j'ai beau lire beaucoup de documentations sur le net je ne trouve pas d'explication clair.

  10. #10
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Ado désigne les requête sql classiques faites à l'aide de DBCommand et méthodes héritées

    List<T> propose une méthode Linq Foreach(Action), mais pour toi je verrai davantage une requête dans un foreach classique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach(int res in getParent())
    {
      //Récupération du label
     
      //Affectation du label à ta liste
    }
    ce qui sera plus clair comme code

    ListeLabel est censé être quoi ? une List<String> ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Exactement, ah ok ADO est donc du SQL classique (sympas les profs aurais pu nous le dire histoire qu'on sache ce qu'on fait héhé).

    Oui ma liste label est un string, j'ai essayer une grosse bidouille mais elle fonctionne pas ^^

  12. #12
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Colle le code de ta grosse bidouille pour voir et surtout al faire fonctionner !

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    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 List<string> getParent()
            {
                int i;
                List<int>ParentId = new List<int>();
                List<string> AllLabels = new List<string>();
                DataClasses2DataContext dc1 = new DataClasses2DataContext();
                var AllParents = (from parents in dc1.ECMTermSetMembership orderby parents.ParentTermId select parents.ParentTermId).Distinct();
                ParentId = AllParents.Where(y => y.HasValue).Select(y => y.Value).ToList();
                DataClasses1DataContext dc2 = new DataClasses1DataContext();
                for (i = 0; i >= AllParents.Count(); i++)
                {
                   string labelo = (from label in dc2.ECMTermLabel orderby label.Label where label.TermId == ParentId[i] select label.Label).Single();
                    AllLabels.Add(labelo);
                }
                 return AllLabels;
            }
    Comme sa le getParent me donnerais directement les labels ^^
    (je travaille actuellement sur un univers de test, donc les noms des variable, des get etc serons retravailler plus tard evidement ^^)

    La sa me permetrais de recuperer directement les labels a ajouter aprés dans ma listbox avec le ListBox1.Items.Source = e.Result()

    Le probleme c'est que sa me renvoie vide, je voit pas trop ou je foire, mais j'suis dedans depuis un moment donc j'me prend peux etre la tete pour quelquechose qui me passe sous le nez ^^

  14. #14
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Erreur sur le for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i = 0; i >= AllParents.Count(); i++)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i = 0; i < AllParents.Count(); i++)
    Si on te lit : Tant que i est supérieur à AllParents.Count() [par exemple 5], on continue, or i vaut 0, donc la boucle s'arrête

    Edit : me semble pas qu'entity supporte Single. Test avec SingleOrDefault ou FirstOrDefault
    Edit 2 : instancie tes Context dans un bloc using() pour gérer correctement la mémoire

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Grahou ! Je fait toujours la meme erreur !!! A chaque fois c'est dingue quoi, je me trompe toujours sur le sens des "<".

    Bon ceci rectifier j'ai le droit a un beau
    La séquence ne contient aucun élément
    EDIT : Sa y est cela fonctionne ! J'ai commencer a i = 1; je sais d'ou viens mon erreur elle viens de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var AllParents = (from parents in dc1.ECMTermSetMembership orderby parents.ParentTermId select parents.ParentTermId).Distinct();
    Qui me retourne un "0" dans la liste dont je n'est pas de correspondance (ce sont des parents etc, et le parent 0 ne possede pas de label car c'est la racine) il faut donc que dans cette requete je demande a retourner tout exepté 0 .

    Merci enormement pour ton aide tu a été genial !!

    Je repasserais surement dans la section pour d'autre erreur, je sens que j'ai pas finis d'en baver mais c'est interessant comme stage ! =)

  16. #16
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    C'est un plaisir

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

Discussions similaires

  1. [Débutant] Impossible de convertir implicitement le type 'string' en 'int?'
    Par Mougain's dans le forum ASP.NET
    Réponses: 4
    Dernier message: 19/11/2014, 14h29
  2. [Débutant] Impossible de convertir le type 'short[]' en 'System.IntPtr'
    Par Elriks dans le forum C#
    Réponses: 6
    Dernier message: 02/12/2011, 09h56
  3. Réponses: 6
    Dernier message: 22/07/2009, 15h27
  4. Réponses: 2
    Dernier message: 19/05/2007, 20h51
  5. Réponses: 2
    Dernier message: 06/03/2007, 19h38

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