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 :

C#, LINQ avec expression lambda : je n'arrive pas à écrire un filtre


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut C#, LINQ avec expression lambda : je n'arrive pas à écrire un filtre
    Bonjour,

    J'ai un problème pour exprimer quelque chose en LINQ.
    Je dois écrire un filtre pour une requête.

    J'utilise un système permettant de rajouter un filtre pour la requête grâce à une méthode qui prend en paramètre une expression lambda.
    La méthode permettant d'ajouter un filtre s'appelle "AndFilter".
    Voici sa signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /// <summary>
            /// Méthode permettant d'ajouter un filtre AND sur le prédicat en cours
            /// </summary>
            /// <param name="filter"></param>
            public void AndFilter(Expression<Func<T, bool>> filter)
            {
                this._predicate = this._predicate.And(filter);
                _isPredicateInInitialState = false;
            }

    On a une table ARTICLES contenant des articles.
    => ID_ARTICLES (clé primaire)
    => ...

    On a une table ARTICLES_SELLING_PRICE contenant le prix des articles.
    => ID ARTICLES (clé primaire : part1)
    => ID_BB_COUNTRIES (clé primaire : part2)
    => SELLING_PRICE
    => ...


    L'utilisateur arrive sur un écran où il peut choisir des filtres à mettre dans une requête qui sélectionne des articles dans la table ARTICLES.
    Mon but est de rajouter un filtre visibilite prix FR : Oui ou Non.
    L'utilisateur coche Oui ou Non via un bouton radio, puis coche un bouton "Ajouter le filtre".

    Mon problème est que je n'arrive pas à retranscrire le filtre Visibilité prix FR => Non, avec le système de le faire en expression lambda dans la méthode AndFilter.

    J'ai réussi à faire le filtre Visibilité FR => Oui.
    Cela donne ceci :

    Pour ce filtre Visibilité FR => Oui :
    il faut sélectionner les articles dans la table ARTICLES,
    dont les ID_ARTICLES apparaissent dans la table ARTICLES_SELLING_PRICE.
    Dans la table ARTICLES_SELLING_PRICE, on a filtré pour ne garder que les enregistrement correspondant à la France (artSel.ID_BB_COUNTRIES == 14).

    Filtre Visibilité FR => OUI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a_populatePredicate.AndFilter(article => article.ARTICLES_SELLING_PRICES.Any(artSel => artSel.ID_ARTICLES == article.ID_ARTICLES && artSel.ID_BB_COUNTRIES == 14));

    Pour le filtre Visibilité FR => NON (celui que je n'arrive à faire)
    Il faut que je sélectionne les articles dans la table ARTICLES dont les ID n'apparaissent pas dans la table ARTICLES_SELLING_PRICE.
    La table ARTICLE_SELLING_PRICE est bien sur filtrée pour n'avoir que les enregistrements correspondant à la France.

    Voilà comment exprimer ça dans ma lambda expression ?
    J'ai pensé au à la négation d'un Contains, ou à faire un Except, mais j'arrive pas à l'écrire..


    Merci de votre aide.

  2. #2
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Citation Envoyé par Johann7751 Voir le message
    Pour ce filtre Visibilité FR => Oui :
    il faut sélectionner les articles dans la table ARTICLES,
    dont les ID_ARTICLES apparaissent dans la table ARTICLES_SELLING_PRICE.
    Dans la table ARTICLES_SELLING_PRICE, on a filtré pour ne garder que les enregistrement correspondant à la France (artSel.ID_BB_COUNTRIES == 14).

    Filtre Visibilité FR => OUI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a_populatePredicate.AndFilter(article => article.ARTICLES_SELLING_PRICES.Any(artSel => artSel.ID_ARTICLES == article.ID_ARTICLES && artSel.ID_BB_COUNTRIES == 14));
    Hello,

    Et simplement : artSel.ID_BB_COUNTRIES != 14

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    a_populatePredicate.AndFilter(article => article.ARTICLES_SELLING_PRICES.Any(artSel => artSel.ID_ARTICLES == article.ID_ARTICLES && artSel.ID_BB_COUNTRIES != 14));

    Non?

  3. #3
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Non je pense pas.
    Pour moi dans ta solution, on récupère tous les articles dont le prix est visible (excepté les articles FR).


    Mais enlevons la notion de langue, pour simplifier le problème.
    (C'est pas la langue, qui me pose souci).
    On fait l'hypothèse que dans la table ARTICLES_SELLING_PRICE, on a que les champs ID_ARTICLES et SELLING_PRICE.
    Comment faire pour écrire mon filtre Visibilité prix => Non ?

  4. #4
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Il faut que je sélectionne les articles dans la table ARTICLES dont les ID n'apparaissent pas dans la table ARTICLES_SELLING_PRICE.
    La table ARTICLE_SELLING_PRICE est bien sur filtrée pour n'avoir que les enregistrements correspondant à la France.
    En gros tu voudrais la traduction en LinQ du "where a.article id not in select(...)" ?

    Cela correspondrait à un
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a_populatePredicate.AndFilter(article => article.ARTICLES_SELLING_PRICES.except(artSel => artSel.ID_ARTICLES == article.ID_ARTICLES))

  5. #5
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Je pense avoir réussi à fair mon filtre en utilisant l'opérateur LINQ All :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a_populatePredicate.AndFilter(article => article.ARTICLES_SELLING_PRICES.All(artSel => artSel.ID_ARTICLES != article.ID_ARTICLES && artSel.ID_BB_COUNTRIES == 14));
    Il y a très probablement plusieurs façons de l'écrire, je vais tester ta solution Er3van.
    Merci.



    [EDIT]
    Ta solution ne fonctionne pas mais c'est dans l'esprit de ce que je voulais faire au début :
    (J'exclue la notion de langue)

    Prendre la liste de tous les articles de la table ARTICLES

    excepté

    la liste des articles dont l'ID_ARTICLE ne se trouve pas dans le table ARTICLES_SELLING_PRICE


    Malheureusement, je n'arrive pas à traduire cela dans mon expression lambda.
    .

    [/EDIT]

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/08/2010, 15h41
  2. Gros soucis avec mon onclick. Je n'arrive pas à l'associer à mon élément
    Par takinelinfo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2008, 11h34
  3. Update avec Select : je n'y arrive pas.
    Par marye77 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 22/02/2008, 16h51
  4. essai "debuter avec hibernate" avec MYSQL et j'y arrive pas
    Par alligator424 dans le forum Hibernate
    Réponses: 5
    Dernier message: 08/08/2007, 14h02
  5. [C# 2005 Express] Pourquoi je n'arrive pas à l'installer ?
    Par Pierre8r dans le forum Visual Studio
    Réponses: 2
    Dernier message: 30/07/2006, 15h49

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