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

VB.NET Discussion :

Linq dynamique sur une List(Of)


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut Linq dynamique sur une List(Of)
    Bonjour à tous,

    J'ai un petit soucis d'optimisation de mon code : j'utilise une liste contenant des objets.
    Grâce à du liq, je fais différentes opérations avec notamment des sélections.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = From mObj As Obj In ListOfObj Where (mObj.value < 13) Select mObj
    J'aimerais savoir, s'il n'était pas possible d'avoir la condition Where dynamique : par exemple, au lieu d'avoir le code en dur, avoir la possibilité de passer un String "mObj.value < 13" qui donnerait le même résultat.
    Cela dans le but d'éviter la redondance dans mon code.

    J'ai regardé sur internet mais je n'ai rien trouvé de fonctionnel

    Par avance, merci à ceux qui auraient des idées !

    @+

  2. #2
    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 : 44
    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
    Par défaut
    Jette un oeil à Dynamic Linq. Le code est inclus dans les samples fournis avec Visual Studio.

    Ca permet de faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As ListOfObj.Where("value < 13")

  3. #3
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Merci de ta réponse Tomlev !

    Je suis justement en train de tester cette méthode mais j'ai des soucis pour utiliser la classe
    Je l'ai mise dans mon projet avec un simple cliquer-glisser : il me lève l'erreur suivante

    'Globalization' n'est pas un membre de 'System'
    à deux endroits

    Une idée de où peut venir l'erreur ?

  4. #4
    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 : 44
    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
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    Je suis justement en train de tester cette méthode mais j'ai des soucis pour utiliser la classe
    Je l'ai mise dans mon projet avec un simple cliquer-glisser : il me lève l'erreur suivante

    'Globalization' n'est pas un membre de 'System' à deux endroits
    Bizarre, vu que la plupart des classes de System.Globalization sont dans mscorlib
    Quel fichier tu as copié ? Dynamic.vb, qui contient le module DynamicQueryable ?

  5. #5
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    J'ai copié la classe Dynamic.vb à la racine de mon projet.
    Par contre, si j'ajoute le projet source à ma solution + référence au projet, cela fonctionne

    Enfin je dis fonctionne mais je n'arrive pas à l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = From mObj As Obj In ListOfObj Where ("mObj.tps < @0 " , 13) Select mObj
    Pour le compilateur, il me manque une parenthèse, que bien sûr si j'ajoute, me dit qu'il y en a une en trop ..

    Bref...

  6. #6
    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 : 44
    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
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    Pour le compilateur, il me manque une parenthèse, que bien sûr si j'ajoute, me dit qu'il y en a une en trop ..

    Tu es sûr que la parenthèse manquante serait pas sur une ligne précédente ?

  7. #7
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Sûr à 100% car la ligne du dessus ne contient qu'une déclaration de variable et celle d'encore au dessus est un For Each...

    De base j'ai voulu mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = From mVectInf As Vecteur In list2 Where ("mVectInf.tps < @0 ", mVectCompare.tps) Select mVectInf
    Erreur : manque une parenthèse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = From mVectInf As Vecteur In list2 Where ("mVectInf.tps < @0 "), mVectCompare.tps) Select mVectInf
    Erreur : fin d'instruction attendue (normal quoi)

    J'ai aussi essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = From mVectInf As Vecteur In list2 Where ("mVectInf.tps <  mVectCompare.tps") Select mVectInf

    La encore, sans succès

    J'ai du loupé un truc !

  8. #8
    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 : 44
    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
    Par défaut
    ah ok, j'avais pas fait gaffe... tu utilises la syntaxe de requête, alors que Dynamic Linq ne peut s'utiliser qu'avec les méthodes d'extension. Il faut l'écrire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = ListOfObj.Where("tps < @0 " , 13)

  9. #9
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    J'ai essayé avec ton bout de code et il me met l'erreur :

    Aucun "Where" accessible n'accepte ce nombre d'arguments
    Quelqu'un a une corde ?

  10. #10
    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 : 44
    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
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    J'ai essayé avec ton bout de code et il me met l'erreur :

    "aucun "Where" accessible n'accepte ce nombre d'arguments"
    As-tu importé le namespace de DynamicQueryable (System.Linq.Dynamic) ? Where est une méthode d'extension, pour l'utiliser il faut importer le namespace

  11. #11
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Citation Envoyé par tomlev Voir le message
    As-tu importé le namespace de DynamicQueryable (System.Linq.Dynamic) ? Where est une méthode d'extension, pour l'utiliser il faut importer le namespace
    oui il est bien importé...
    je viens de vérifier les imports de mon projet !

    importé mais pas pris en compte

  12. #12
    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 : 44
    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
    Par défaut
    Ah ok, je vois... Dynamic Linq fonctionne sur IQueryable, pas IEnumerable. Donc il faut que tu appelles AsQueryable sur ta collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = ListOfObj.AsQueryable().Where("tps < @0 " , 13)

  13. #13
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    pour ta réponse, cela fonctionne !!!

    par contre, n'y a t-il pas un autre moyen pour que je puisse utiliser cela sans devoir faire une référence vers le projet ?
    car en copiant la classe, j'ai toujours mon erreur sur la globalization...

  14. #14
    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 : 44
    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
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    pour ta réponse, cela fonctionne !!!

    par contre, n'y a t-il pas un autre moyen pour que je puisse utiliser cela sans devoir faire une référence vers le projet ?
    car en copiant la classe, j'ai toujours mon erreur sur la globalization...
    J'ai testé, effectivement j'ai la même erreur... ça fonctionne si tu ajoutes ça au début du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imports System.Globalization
    et que tu remplaces System.Globalization.CultureInfo par CultureInfo

    Et ça me conforte dans l'idée que la syntaxe de VB est vraiment complètement pourrie


    EDIT: ah en fait j'ai compris... comme le code est déclaré dans un namespace qui est déjà sous System, il faut pas écrire System.Globalization mais juste Globalization... vraiment tordu

  15. #15
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    ça fonctionne !!

    bravo à toi et surtout merci de ton aide

  16. #16
    Membre émérite Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Par défaut
    Et pourquoi pas passer des expression lambda plutot que des string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public List<T> TFind (Expression<Func<T, bool>> where)
    {
        return Ts.Where(where).ToList();
    }
    Best regards

  17. #17
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Je n'avais pas envisagé cette solution...
    Il est vrai que ça peut être une autre manière de le faire.

    Pour l'instant, le linq répond à mes attentes (création dynamique par le client de requêtes) mais je vais voir pour creuser ton idée

    merci

  18. #18
    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 : 44
    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
    Par défaut
    Citation Envoyé par zeavan Voir le message
    Et pourquoi pas passer des expression lambda plutot que des string.
    Effectivement, dans l'absolu c'est mieux... mais j'avais l'impression que le but était de pouvoir générer dynamiquement les critères de filtre, ce qui est nettement plus facile à faire avec des chaines

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

Discussions similaires

  1. [IP-2010] Filtre dynamique sur une zone de liste à sélection multiple
    Par Yoran_L dans le forum InfoPath
    Réponses: 3
    Dernier message: 02/06/2015, 12h12
  2. Rafraichissement dynamique d'une colonne calculée sur une liste
    Par jsflamar dans le forum Développement Sharepoint
    Réponses: 0
    Dernier message: 24/11/2011, 17h26
  3. Réponses: 4
    Dernier message: 16/06/2005, 15h37
  4. Selectionnet tous ou faire un clear sur une liste
    Par Canou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/11/2004, 10h26
  5. [Débutant][jsp] évènement sur une liste
    Par phoebe dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 14/05/2004, 10h53

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