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

Entity Framework Discussion :

Requête avec where conditionnel


Sujet :

Entity Framework

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 37
    Points : 24
    Points
    24
    Par défaut Requête avec where conditionnel
    Bonjour,

    je recherche un moyen de faire une requête LinQ conditionnelle car je n'ai pas trouvé de réponse vraiment claire à ce sujet.

    Admettons que je veuille afficher la jointure entre une table client et une table commande dans une grille. Ma grille est remplie lorsque je clique sur un bouton de recherche après avoir rempli certains champs dans ma page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MyModel.MyEntities context = new MyModel.MyEntities();
     
    GridViewResults.DataSource = from co in context.Commande
          join cl in context.Client on co.idx_client equals cl.id_client
          where co.lib_commande.Contains(TextBoxNumCommande.Text)
          where cl.nbr_articles == intNbrArticles
           select new{ co, cl};
     
    GridViewResults.DataBind();
    Ceci fonctionne bien si mon champs intNbrArticles est rempli mais comment faire si le champs n'est pas rempli?
    Le souci c'est que je vais avoir plus de 50 champs de filtre dans ma page donc j'aimerai pouvoir créer ma requête à la manière d'un StringBuilder ou avoir un where conditionnel qui insère ou non la clause ou toute autre solution...
    Merci

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 250
    Points : 420
    Points
    420
    Par défaut
    Salut tu peux faire avec les || et && :

    ...
    where cl.nbr_articles == intNbrArticles || cl.name == "toto"
    ...

    ou autre exemple en utilisant les ? : pour if else :

    ...
    where string.IsNullOrEmpty(cl.name) ? cl.name == "toto" : false
    ...

  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
    Tu peux ajouter un Where dynamiquement :

    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
    MyModel.MyEntities context = new MyModel.MyEntities();
     
    var query =
          from co in context.Commande
          join cl in context.Client on co.idx_client equals cl.id_client
          where co.lib_commande.Contains(TextBoxNumCommande.Text)
          select new { co, cl };
     
    if (LeChampEstRempli())
    {
        query = from x in query
                   where x.cl.nbr_articles == intNbrArticles;
    }
     
    GridViewResults.DataSource = query;
     
    GridViewResults.DataBind();

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    @Julien G :
    Déjà merci pour ta réponse, la deuxième solution marche nickel pour avoir tous mes champs conditionnés sur le fait qu'ils aient été remplis au préalable par contre pour ma culture perso, je ne comprends pas la première proposition, en fait, je voudrais un AND entre les deux conditions et si je le fais sans remplir les champs ça ne fonctionne pas...

    @tomlev :
    Merci à toi aussi, j'avais vu qu'on pouvait faire ça mais avec 50 champs de recherche, je cherchais quelque chose de plus condensé. cette méthode n'est pas plus lourde en termes de performances du fait qu'on requête plusieurs fois?

  5. #5
    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
    Citation Envoyé par jeanjean40 Voir le message
    Merci à toi aussi, j'avais vu qu'on pouvait faire ça mais avec 50 champs de recherche, je cherchais quelque chose de plus condensé. cette méthode n'est pas plus lourde en termes de performances du fait qu'on requête plusieurs fois?
    On ne requête pas plusieurs fois, contrairement aux apparences... C'est l'un des principes de Linq : l'exécution est différée. La requête SQL n'est exécutée sur la base que quand on commence à essayer de récupérer les résultats, ce qui en l'occurrence ne se produit pas avant l'appel DataBind.

    Pour ce qui est de la complexité de la requête générée, il faudrait vérifier, mais je pense que le fait qu'il y ait plusieurs Where d'affilée est optimisé par le provider Linq (au pire, ce sera probablement optimisé par le SGBD lui-même)

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 250
    Points : 420
    Points
    420
    Par défaut
    Tu peux toujours utiliser les prédicates sur une ICollectionView :

    Code C# : 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
     
    // Déclaration
    ICollectionView Source { get; set; }
     
    Initialisation
    this.ListboxControl.ItemsSource = this.Source;
    this.ListboxControl.ItemsSource = CollectionViewSource.GetDefaultView(this.Source);
     
    // Filtre
    this.Source.Filter = item =>
    {
        ViewItem vitem = item as ViewItem;
        if (vitem == null) return false;
     
        return  vitem.Name.Contains("A");
     
    };

    Grâce à ca, en gros, tu tapes dans ta collection, et seule la vue est modifiée. Pas le contenu de ta collection.


    Un site qui explique mieux que moi : http://bea.stollnitz.com/blog/?p=31

  7. #7
    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
    Citation Envoyé par Julien_G Voir le message
    Tu peux toujours utiliser les prédicates sur une ICollectionView :
    Effectivement ça peut aussi être une bonne solution, à condition que la quantité de données soit raisonnable (vu que toutes les données sont chargées en mémoire)...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 37
    Points : 24
    Points
    24
    Par défaut
    Encore une fois merci à tous les deux!

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

Discussions similaires

  1. requête avec "where 1"
    Par Amanck dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/07/2008, 08h10
  2. [MySQL] Requête avec WHERE 1 AND et plein de OR le AND n'est pas pris en compte
    Par alsaco68 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/01/2008, 10h09
  3. [MySQL] requête avec WHERE sur primary key
    Par newbiemac dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/09/2007, 09h41
  4. requête avec WHERE A < Date < B de semaine en semaine
    Par cortex024 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/06/2007, 14h41
  5. Problème de requête avec WHERE MAX()
    Par seb92500 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 24/01/2007, 12h27

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