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 :

Comment renvoyer le résultat d une requête Linq ?


Sujet :

Linq

  1. #1
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut Comment renvoyer le résultat d une requête Linq ?
    Bonjour,

    j'ai un petit problème qui me trotte dans la tête.
    Dans mon programme, je viens à réaliser de nombreuses fois la même requête Linq. Pour éviter cette redondance, je me suis dit que j'allais coder une méthode dans une class qui fait cette requête et qui me renvoi le résultat.
    Seulement problème, je n'arrive pas à renvoyer le résultat d'une manière "correcte" qui me permet de le manipuler (le résultat) correctement par la suite.

    Le code de la requête est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var query = from c in dt.AsEnumerable()
                                        select new
                                        {
                                            Adresse = c.Field<string>("Adresse"),
                                            Mnemonique = c.Field<string>("Mnémonique"),
                                            Commentaire = c.Field<string>("Commentaire")
                                        };
    Une requête pas bien compliquée qui me permet de faire des instructions après du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (var v in query)
                        {
                            if (v.Adresse != null)
                                nAdr++;
                            if (v.Mnemonique != null)
                                nMne++;
                            if (v.Commentaire != null)
                                nCom++;
                        }
    Seulement si je veux placer la requête LINQ dans une méthode, comment est ce que je peux retourner le "query" correctement afin de pouvoir le manipuler dans une autre classe comme je le ferait normalement.

    On ne peut évidemment pas retourné un "var", le mot-clé n'est pas utilisable dans ces circonstances. J'ai essayé de retourner un EnumerableRowCollection, cela fonctionne mais lorsque dans une autre classe je stock cette EnumerableRowCollection dans un "var", je ne peux pas faire quelque chose du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach(var vr in maQueryRecuperer)
    {
       if(vr.Adresse != null) ...
    }
    Il ne connaît évidemment pas "Adresse".
    Il y a surement une sorte de Cast() à faire ou quoi mais je ne trouve pas et je trouve ça "dommage" si je dois me retaper 5 ou 6 fois la même requête dans 5 ou 6 classes différentes d'un même programme.

    J'espère avoir été assez "clair" et que quelqu'un passant par ici aura une solution à mon problème

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    pourquoi ne pas laisser les types anonymes de côté et créer une structure avec tes trois propriétés ? Ensuite tu manipules/renvoies des IEnumerable<MaStructure>.

  3. #3
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par MetalGeek Voir le message
    Salut,
    pourquoi ne pas laisser les types anonymes de côté et créer une structure avec tes trois propriétés ? Ensuite tu manipules/renvoies des IEnumerable<MaStructure>.
    Je pense que c'est la solution en effet mais j'ai un peu de mal à "visualiser" la chose. Enfin je vais m'obstiner

    Merci pour ta réponse je vais voir ça

  4. #4
    En attente de confirmation mail
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Points : 133
    Points
    133
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class AdressBook
    {
    public string Adresse { get; set;}
    public string  Mnemonique { get; set;}
    public string  Commentaire { get; set;}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
    IEnumerable<AdressBook> query = from c in dt.AsEnumerable()
                                        select Adresse = c.Field<string>("Adresse"),
                                            Mnemonique = c.Field<string>("Mnémonique"),
                                            Commentaire = c.Field<string>("Commentaire")
                                        ;

  5. #5
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    S'il n'y a pas de "new" derrière le select, il ne connait pas "Adresse", "Mnemonique", etc... dans la requête Linq.

    En plus ici je ne récupère pas seulement des string mais un ensemble de string...
    Donc j'avais essayé de faire avec une classe et 3 List<string> et les méthodes d'ajouts et de parcours appropriés, mais sans passer par IEnumerable<>.

    En fait c'est un peu un Objet<string,string,string> avec un index sur l'objet quoi... en sachant que je récupères environs 6000 lignes.
    Donc mes 3 List contiennent 6000 entrées chacune.
    Ça fonctionnait mais c'est beaucoup plus lent que de faire la requête et d'utiliser directement les champs.
    Tant pis, je crois que je vais laisser le fait de la répéter plusieurs fois. J'utilise les champs dans des algorithmes par après et si l'accès est beaucoup plus lent, les algorithmes aussi ... et ça, c'est un problème :\

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    J'ai eu le même soucis.
    Voilà ce que j'ai fais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class MonObjet
    {
       public string Adresse { get; set;}
       public string  Mnemonique { get; set;}
       public string  Commentaire { get; set;}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public IQueryable<MonObjet> MaQuery
    {
       var q = from c in dt.AsEnumerable()
                  select new MonObjet
                  {
                     Adresse = c.Field<string>("Adresse"),
                     Mnemonique = c.Field<string>("Mnémonique"),
                     Commentaire = c.Field<string>("Commentaire")
                  };
       return q;
    }
    ;

    Et ensuite dans ton code appelant, tu feras un truc tout simple du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void MaFonction()
    {
       var q = from x in MaQuery
                  where x.Adresse == "Paris"
                  select q;
    }
    Je ne sais pas si c'est ça que tu cherches à faire, du moins c'est ce que j'en ai compris

  7. #7
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Bingooooooo

    Avec toutes vos réponses, j'ai trouvé solution à mon problème
    Un peu de l'un, un peu de l'autre et le tour est joué !

    beaucoup !

  8. #8
    En attente de confirmation mail
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Points : 133
    Points
    133
    Par défaut
    Ah oui ca pouvait pas marcher ma soluce

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IEnumerable<AdressBook> query = from c in dt.AsEnumerable()
                                        select new AdressBook
    { Adresse = c.Field<string>("Adresse"),
                                            Mnemonique = c.Field<string>("Mnémonique"),
                                            Commentaire = c.Field<string>("Commentaire")
                                       } ;
    Voila c'est mieux

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 22/12/2008, 16h07
  2. Comment récupérer le résultat d'une requête ?
    Par vito12345 dans le forum JDBC
    Réponses: 1
    Dernier message: 18/02/2007, 11h33
  3. Réponses: 11
    Dernier message: 20/06/2006, 12h10
  4. [SimpleXML] Comment exploiter le résultat d'une requête XML-RPC
    Par tiboel dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/02/2006, 20h57
  5. Réponses: 1
    Dernier message: 29/09/2005, 13h05

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