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 de convert dans un where


Sujet :

Linq

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut Problème de convert dans un where
    Salut,

    J'ai décidé de me mettre à jour (eh oui, mieux vaut tard que jamais) et de me lancer dans l'étude de linq.

    Bien entendu je butte sur certaines choses.
    Généralement je finis par trouver une solution, mais là je coince et je ne trouve pas ce que je ne fais pas bien.

    Soit une base de donnée MSAccess contenant, entre autre, une table "point" qui contient, entre autre une colonne "NoPoint" et une autre colonne "NoPointNum".
    La colonne "NoPoint" contient du string et "NoPointNum" contient du int.

    Ne me demandez pas pourquoi, mais dans une autre table un champs contient la concaténation de ces 2 champs (je trouve cela parfaitement illogique mais je dois vivre avec).

    Je veux donc trouver en linq comment créer mon where avec la concaténation de ces 2 champs (qui doivent former un string) pour le comparer.

    Vu que je vais devoir faire plusieurs recherche, je charge tous les points en une fois par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var queryPoints = from point in points select point;
    qui fonctionne bien.

    Ensuite, selon les besoin, je cherche à extraire un point particulier.
    Pour cela j'ai essayé plusieurs choses mais je n'y arrive pas.
    J'ai donc décidé de découper le problème.
    Je cherche d'abord à trouver un point qui n'a qu'un numéro à chercher, ce qui me permet de ne pas m'occuper au départ de la concaténation.

    J'ai donc écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var queryPoint = queryPoints.Where(point => point.NoPointNum.ToString() == ligne.NumeroPoint1);
    point.NoPointNum étant un int et ligne.NumeroPoint1 étant un string, j'essaye de convertir le int en string, et c'est là que ça coince.
    Je reçois "Fonction « CONVERT » non définie dans l'expression."

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var queryPoint = queryPoints.Where(point => Convert.ToString(point.NoPointNum) == ligne.NumeroPoint1);
    mais j'ai le même résultat.

    Comment dois-je faire pour convertir ce champs et pour concaténer les 2 ?

    En fait, je cherche à traduire la ligne suivante en linq
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where (point.NoPoint & point.NoPointNum == ligne.NumeroPoint1)
    Merci de vos z'avis z'avisés,
    Jean-Marc
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Et ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int numeroPoint = int.Parse(ligne.NumeroPoint1);
    var queryPoint = queryPoints.Where(point => point.NoPointNum == numeroPoint);
    Sinon la question qu'il faut vraiment se poser c'est pourquoi ligne.NumeroPoint1 est un string surtout que le nom de la variable attend un numéro donc un entier;

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Effectivement le modèle de données a l'air un peu foireux...

    Par curiosité, qu'est-ce que tu utilises comme provider Linq ? Ceux qui sont fournis avec le framework (Linq to SQL et Entity Framework) ne supportent pas Access...

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    Merci de vos réponses.

    En effet, le modèle de données est complètement foireux.
    Même encore plus que ce que j'ai expliqué puisque chaque point a un ID. Pourquoi ne pas utiliser l'ID ? C'est la question que je me pose encore.
    Mais comme je disais aussi, il faut que je vive avec. En effet il s'agit d'un fournisseur qui fournit aussi des ministères. Je pense donc qu'ils ne modifieront pas leur structure pour me faciliter la vie.

    J'en reviens à mon problème :
    Je ne peux pas convertir ligne.NumeroPoint1 en int car, comme je l'expliquais, ligne.NumeroPoint1 contient la concaténation de point.NoPoint et point.NoPointNum
    Comme je débute et que j'ai 2 problèmes à résoudre, je les traite un par un.
    D'abord je commence par chercher un point dont point.NoPoint est null, ce qui me permet de ne pas en tenir compte.
    Mais il y a aussi des lignes de ligne.NumeroPoint1 qui sont en string.
    A l'arrivée il me faut rechercher la valeur de ligne.NumeroPoint1 dans la concaténation de point.NoPoint et point.NoPointNum.
    Je n'ai donc pas le choix de convertir point.NoPointNum en string, ce qui me pose le problème.

    En ce qui concerne l'utilisation de Linq avec Access, j'ai ce code ci qui fonctionne jusqu'à la ligne
    var queryPoint = queryPoints.Where(point => Convert.ToString(point.NoPointNum) == ligne.NumeroPoint1);
    et à l'arrivée je cherche à avoir qqch du style
    var queryPoint = queryPoints.Where(point => (point.NoPoint & Convert.ToString(point.NoPointNum)) == ligne.NumeroPoint1);

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data.OleDb;
    using System.Linq;
    using System.Text;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
     
    ...
     
    if (Bdd.Connect(bddPath))
                {
                    try
                    {
     
                        DataContext ctx = new DataContext(Bdd.BddConnection);
     
                        Table<VisionParcelle> parcelles = ctx.GetTable<VisionParcelle>();
                        Table<VisionLigne> lignes = ctx.GetTable<VisionLigne>();
                        Table<VisionPoint> points = ctx.GetTable<VisionPoint>();
                        Table<VisionPCode> pcodes = ctx.GetTable<VisionPCode>();
     
                        var queryParcelle = from parcelle in parcelles where parcelle.NuméroForme == NumParcelleVision select parcelle;
     
                        if (queryParcelle.Count() > 0)
                        {
                            visionParcelle = queryParcelle.Single<VisionParcelle>();
                            //créer objet parcelle
     
                            var queryPoints = from point in points select point;
                            var queryPCodes = from pcode in pcodes select pcode;
     
                            var queryLignes = from ligne in lignes where ligne.NuméroForme == NumParcelleVision orderby ligne.NuméroLigne select ligne;
                            foreach (VisionLigne ligne in queryLignes)
                            {
                                var queryPoint = queryPoints.Where(point => Convert.ToString(point.NoPointNum) == ligne.NumeroPoint1);
                                foreach (VisionPoint pt in queryPoint)
                                {
                                       //ajouter point dans objet ligne
                                }
     
                                //ajouter ligne dans objet parcelle
                            }
                        }
                    }
                    finally
                    {
                        Bdd.Disconnect();
                    }
                }
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Points : 122
    Points
    122
    Par défaut
    En fait, pour l'accès à la BD MSAccess via Linq je me suis basé sur ceci.
    Il n'y a pas de problèmes. Il n'y a que des solutions.
    Malheureusement, elles sont parfois un peu dur à trouver ...


    Aucune touche n'a été maltraitée pour réaliser ce texte.

Discussions similaires

  1. [2014] Comment enlever le convert dans le where ?
    Par olivtone dans le forum Développement
    Réponses: 7
    Dernier message: 05/03/2015, 10h57
  2. problème de paramètre dans le where
    Par rominous41 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/05/2011, 15h21
  3. [MySQL] Problème de variable dans instruction WHERE
    Par ripout dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/08/2010, 10h21
  4. Convert dans le where
    Par ririch dans le forum Développement
    Réponses: 19
    Dernier message: 23/06/2009, 10h05
  5. Problème de count dans un where
    Par Djobird dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/07/2008, 14h30

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