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 :

Passer variable dans la clause Where : possible?


Sujet :

Linq

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut Passer variable dans la clause Where : possible?
    Bonjour,

    Histoire d'essayer de ne pas mourir idiot, je me frotte à Linq.

    J'ai un dataset basé sur une classe Linq to Sql qui s'affiche dans un datagridview, tout roule..

    Je voudrais mettre des critères de filtre (des combo ou textbox) et donc modifier la clause where selon que les dites Box ont quelque chose ou rien, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim mavar as string
    if not textbox.text="" then mavar=" nom=textbox.text"
     
    dim maquery =from .... where mavar
     
    madatagridviewbindingsource.datasource=maquery.
    Est-ce possible ou m'égare-je?

    Merci,

    JFB

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Points : 154
    Points
    154
    Par défaut
    C'est tout à fait possible! A titre d'exemple, voici une fonction qui prend une DateTime en paramètre et qui établit ainsi le critère de la clause Where.
    A+

    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
     
     
            '''<summary>Obtient la collection d'Inventaires après une date d'encodage</summary>
            '''<param name="dApres">Date d'encodage supérieure à...</param>
     
            Function DateApres(ByVal dApres As DateTime) As Collection
     
                Dim oCollInventaire As Collection
                Try
                    Dim oQuerryInventaire = From oLivres In oScanDataContext.TblLivres _
                           Where oLivres.Dencode > dApres _
                           Select oLivres.Inventaire
     
                    oCollInventaire = ArrayToColl(oQuerryInventaire.ToArray())
                    Return oCollInventaire
                Catch ex As Exception
                    MsgBox(ex.Message, MsgBoxStyle.Critical, My.Settings.pAppEnteteBox)
                    Return Nothing
                End Try
            End Function

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Bonsoir Paul et merci d'avoir répondu... :-)

    Je me suis mal exprimé : j'ai l'habitude (en vba) de concaténer une clause where puis de la passer pour ouvrir un recordset par exemple. L'idée était là aussi, selon la valeur de mes combo/textbox (il y en a 5) de créer une clause Where que j'aurais passée telle quelle...

    Mais peut-être qu'il existe une alternative : en effet mon problème est de "superposer" les filtres... Exemple : combo1 = type, combo 2 = categorie.

    Ce que je veux faire, c'est filtrer mon datagridview sur l'un ou l'autre ou les deux, selon qu'ils sont remplis ou non. Lorsqu'il y a une valeur, ça roule, mais comment gérer le cas où le combo est vide? Avec la méthode ci-dessus, si le combo est vide, on ne l'inclut pas dans la clause Where et le tour est joué...

    Peut-être existe-t-il un argument qui dit
    "where combo="toto" ou combo=tous? "

    Je cherche mais ne trouve pas :-)

    Bonne soirée,

    JFB

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 216
    Points : 154
    Points
    154
    Par défaut
    Oui, je vois bien. J'ai eu un problème similaire. Je l'ai résolu en écrivant une requête LINQ pour chaque clause where possible. J'ai cherché "plus propre", mais je n'ai pas trouvé...
    Bon, je ne suis pas un expert non plus... Si il y une autre possibilité, je ne l'ai pas trouvé

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Points : 64
    Points
    64
    Par défaut
    Petit exemple d'utilisation de la clause where de Linq avec un control (TextBox ici) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = from i in source where i.Nom == TextBox1.Text OR i.Prenom == TextBox2.Text select i
    Ce qu'il faut bien comprendre avec Linq, c'est que tu ne créé par une requête à executer sur une base de données (ou autre), mais tu manipule des objets.

    Cdt,
    Kevin D.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 64
    Points
    64
    Par défaut
    Paul,
    Effectivement, c'est pas simple... et avec 5 text/combobx, ça fait un paquet de combinaisons!

    Kevin,
    Je te remercie, ça je savais faire. Comme dit, plus haut, c'est toute la clause where qui devrait être conditionnelle, pas seulement des variables à affecter aux conditions. Genre :

    si textbox n'est pas vide, alors where toto=textbox.text, mais si textbox est vide, alors la clause where saute...

    Je pense à un truc : n'existe-t-il pas des clauses "Optionnelles" dans Sql...? je vais regarder! :-)

    Merci en tout cas, bonne fin de week-end,

    Amicalement,

    JFB

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Points : 64
    Points
    64
    Par défaut
    Dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query = from i in source where (i.Nom == TextBox1.Text OR TextBox1.Text == String.Empty) AND (i.Prenom == TextBox2.Text OR TextBox2.Text == String.Empty) select i
    Cdt,
    Kevin D.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 80
    Points : 111
    Points
    111
    Par défaut
    Tu peux chercher aussi une classe qui s'appelle dynamic linq je crois que ca a rapport justement avec ca.

Discussions similaires

  1. Problème de variable dans la clause WHERE avec CONVERT + DATE
    Par Archi89 dans le forum Développement
    Réponses: 4
    Dernier message: 09/01/2015, 20h35
  2. [OPTIMISATION] Date en tant que variable dans les clauses WHERE
    Par dens19 dans le forum Développement
    Réponses: 11
    Dernier message: 18/09/2009, 08h57
  3. [MySQL] Introduire une variable dans la clause where
    Par ledisciple dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/08/2009, 12h39
  4. variables dans la clause where
    Par ledisciple dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/08/2009, 15h17
  5. Réponses: 3
    Dernier message: 11/12/2005, 11h15

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