none
Expression lamda complexe

    Question

  • Bonjour

    J'ai une class Toponyme avec des propriétés comme Commune, CodeINSEE, CodePostal, Departement, Region, Pays

    Puis une List<Toponyme> Liste

    Je dois faire des recherche sur cette liste et utilise une lamda du genre

    var trouves = new List<Toponyme>();

    trouves = Liste.Where(x => x.Commune== commune, x.CodeINSEE == codeINSEE,  ......

    Or je dois pouvoir faire cette recherche selon les information que j'ai sur le CodeINsee, le codePostal etc.

    ce qui m'amène a mettre en place autant d'expression de de combinaisons exemple:

    trouves = Liste.Where(x => x.Commune== commune)

    trouves = Liste.Where(x => x.Commune== commune, x.CodeINSEE == codeINSEE)

    trouves = Liste.Where(x => x.Commune== commune, x.CodePostal == codePostal)

    trouves = Liste.Where(x => x.Commune== commune, x.Departement== departement)

    etc.

    Il y a t il un moyen de regrouper ces lamda avec des paramètres qui seraient actifs si ils ne sont pas null ou vide?

    Merci

    Bernard


    Bernard Bouree

    vendredi 29 septembre 2017 12:52

Réponses

  • Bonjour,

    Les différentes conditions "Where" se cumulent comme un opérateur AND. En faisant des "Where()" successifs vous construisez une "chaine" d'opérateurs qui seront appliqués les un après les autres lors de l'exécution de l'itération de l'énumérable.

    Lorsque vous faite un "ToList()" vous provoquez l'itération.

    J'ai écris il y a quelques années un article sur les énumérables et leur fonctionnement: https://blog.ygrenier.com/2015/01/soyons-enumerables-partie-1/ et plus particulièrement la troisième partie concernant Linq. En espérant que ces articles vous aident.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse BernardBouree lundi 2 octobre 2017 08:00
    lundi 2 octobre 2017 07:43

Toutes les réponses

  • Bonjour,

    Si je comprends bien vous voulez "ajouter" des conditions à votre filtre en fonction des recherches définies, si c'est le cas:

    // Construction de la requête en fonction des paramètres
    var qry = List.AsQueryable();
    
    if(!string.IsNullOrWhiteSpace(commune))
      qry = qry.Where(x => x.Commune == commune);
    
    if(!string.IsNullOrWhiteSpace(codeINSEE))
      qry = qry.Where(x => x.CodeINSEE == codeINSEE);
    
    ...
    
    // Exécution de la requête
    var trouves = qry.ToList();
    
    

    Les opérateurs LINQ (where, orderby, etc...) peuvent se chainer (pour se cumuler) mais n'exécutent pas immédiatement le traitement. Ce dernier est effectué sur les méthodes ToList()/ToArray()/Count() etc.

    Donc on peut "construire" la requête comme je le montre avec les deux premières conditions, et on provoque la recherche avec le ToList().

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse BernardBouree vendredi 29 septembre 2017 14:52
    • Non marqué comme réponse BernardBouree samedi 30 septembre 2017 10:06
    vendredi 29 septembre 2017 13:23
  • Or je dois pouvoir faire cette recherche selon les information que j'ai sur le CodeINsee, le codePostal etc.

    ce qui m'amène a mettre en place autant d'expression de de combinaisons exemple:

    trouves = Liste.Where(x => x.Commune== commune)

    trouves = Liste.Where(x => x.Commune== commune, x.CodeINSEE == codeINSEE)

    trouves = Liste.Where(x => x.Commune== commune, x.CodePostal == codePostal)

    trouves = Liste.Where(x => x.Commune== commune, x.Departement== departement)

    etc.


    Pour tu fait les combinaisons ? c'est pas claire  
    vendredi 29 septembre 2017 14:40
  • Bonjour Yan

    Merci beaucoup c'est exactement ce que je cherchais!

    Cordialement

    Bernard


    Bernard Bouree

    vendredi 29 septembre 2017 15:10
  • Re bonjour Jan

    Quel est le principe du qry.ToList()?

    Est-ce une addition ou un produit ?

    Si l'un qry est vide le qry final sera vide ?

    Merci

    Bernard


    Bernard Bouree

    vendredi 29 septembre 2017 16:26
  • Bonjour

    Voici ma méthode bâtie sur les indications de Jan

    private static List<ToponymeGeoDb> Recherche_City(Toponyme topoL, string communeRecherchee = ""bool avecParenthese = false)
            {
             IQueryable<ToponymeGeoDb> qry = ListeToponymesGeoDb.AsQueryable();
     
                string recherchee = IsNullOrEmpty(communeRecherchee) ? topoL.CommuneRecherchee : communeRecherchee;
     
                if (avecParenthese)
                    qry = qry.Where(x => x.City.Contains("{"));
                else
                    qry = qry.Where(x => string.Equals(x.City, recherchee, StringComparison.InvariantCultureIgnoreCase));
     
                if (!string.IsNullOrEmpty(topoL.CityGeoCode))
                    qry = qry.Where(x => x.CityGeoCode == topoL.CityGeoCode);
     
                if (!string.IsNullOrEmpty(topoL.County))
                    qry = qry.Where(x => string.Equals(x.County, topoL.County, StringComparison.InvariantCultureIgnoreCase) ||
                                     string.Equals(x.County, topoL.State, StringComparison.InvariantCultureIgnoreCase) ||
                                     string.Equals(x.County, topoL.Region, StringComparison.InvariantCultureIgnoreCase));
                
     
                if (!string.IsNullOrEmpty(topoL.Country))
                    qry = qry.Where(x => x.Country == topoL.Country);
     
                return qry.ToList();
     
            }

    Mais j'obtiens des résultats erronés.

    Comment se combinent les différents qry? 

    Est-ce l'addition de chaque qry ?

    Merci

    Bernard


    Bernard Bouree

    samedi 30 septembre 2017 10:11
  • Bonjour,

    Les différentes conditions "Where" se cumulent comme un opérateur AND. En faisant des "Where()" successifs vous construisez une "chaine" d'opérateurs qui seront appliqués les un après les autres lors de l'exécution de l'itération de l'énumérable.

    Lorsque vous faite un "ToList()" vous provoquez l'itération.

    J'ai écris il y a quelques années un article sur les énumérables et leur fonctionnement: https://blog.ygrenier.com/2015/01/soyons-enumerables-partie-1/ et plus particulièrement la troisième partie concernant Linq. En espérant que ces articles vous aident.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse BernardBouree lundi 2 octobre 2017 08:00
    lundi 2 octobre 2017 07:43
  • Bonjour Yan

    et merci pour ces informations très UTILES !

    Cordialement

    Bernard


    Bernard Bouree

    lundi 2 octobre 2017 08:01