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

C# Discussion :

Reformulation de requête Linq


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 118
    Points : 100
    Points
    100
    Par défaut Reformulation de requête Linq
    bonjour,

    Je suis toujours dans mes tris avec Linq. Mon code fonctionne mais je le trouve pas très joli. Je pense que l'on peut l'exprimer de façon plus propre.

    La collection à trier est de type List<ExternalData>. ExternalData est une classe de base abstraite. Dans mon cas, j'utilise la classe dérivée ExternalAnimal pour trier (pour les tests selon l'ID ou le nom et plus tard la date de naissance ou je ne sais quoi).

    Le diagramme de classes ressemble à ça :
    Nom : ClassDiagram.PNG
Affichages : 145
Taille : 47,6 Ko

    Ce code là permet de lister de manière unique toutes les races et de les retourner dans List<string> et de les trier par ordre croissant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var qry7 = this.Collection.Select(p => ((ExternalAnimal)p).Breed1).Distinct().ToList();
    qry7.Sort();
    Donc j'ai cette autre requête qui fonctionner presque comme la précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var qry3 = this.Collection
    .Select(p => ((ExternalAnimal)p).Breed1)
    .Distinct()
    .ToList();
    à l'exception de .OrderBy que je n'arrive pas à définir pour que ça compile. C'est probablement une bricole mais là vu l'heure, je fatigue et je tourne en rond
    Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Bonjour,
    La seule différence que je vois entre les deux codes (exception faite de la mise en page) est l'appel de la méthode sort().

    Il ne te manque donc qu'un qry3.sort() pour avoir le même résultat.

    Tatayo.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 118
    Points : 100
    Points
    100
    Par défaut
    yop.
    Je précise mon souci. Je voudrais utiliser le .OrderBy / orderby à la place du .Sort() et le tout couplé à Distinct()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Oups, j'ai zappé le côté OrderBy().

    Pour trier sur une propriété de ta classe, il faut faire un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     var qry3 = this.Collection
    .Select(p => ((ExternalAnimal)p).Breed1)
    .Distinct()
    .sortBy(a => a.id) // ici il faut remplacer Id par la propriété/le membre sur lequel doit être basé le tri
    .ToList();
    A moins que je n'ai encore raté un truc ?

    Tatayo

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    Bon, après quelques essais de mon côté (j'ai un peu le même problème en fait), j'ai réussi à faire ce que tu cherches.
    Dans le code que j'ai donné dans mon dernier message, il faut remplacer SortBy() par OrderBy().
    Ca fonctionne de mon côté, mais je suis en dotNet core:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var articles = julia.Article
    		.Select(p => p)
    		.Where(p => p.ArtCCodeUvc.StartsWith("2"))
    		.OrderBy(p => p.ArtCCodeUvc);
    Ce qui correspond chez moi à cette version:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var articles = from pdt in julia.Article
    			   where pdt.ArtCCodeUvc.StartsWith("2")
    			   orderby pdt.ArtCCodeUvc
    			   select pdt;
    Tatayo.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 118
    Points : 100
    Points
    100
    Par défaut
    Yop.
    alors si je mets ça : ça compile mais il retourne toute la liste des ExternalAnimal classé par ordre croissant d'Id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var qry9 = this.Collection
    .Select(p => p)
    .Distinct()
    .OrderBy(a => ((ExternalAnimal)a).Id)
    .ToList();
    là ça retourne bien les races uniques triée par Id mais il retourne des ExternalAnimal (ce qui n'a pas trop de sens)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var qry5 = this.Collection
    .GroupBy(p => ((ExternalAnimal)p).Breed1)
     .Select(g => g.First())
    .ToList();
    mais si je fais ça : il ne compile plus sur le OrderBy puisque c'est un type string (à cause du Select)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var qry10 = this.Collection
    .Select(p => ((ExternalAnimal)p).Breed1)
    .Distinct()
    .OrderBy(a => ((ExternalAnimal)a).Id)
    .ToList();

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 280
    Points : 12 974
    Points
    12 974
    Par défaut
    De ce que je comprends, pour que le tri soit possible, il faut que la donnée sur laquelle il doit porté soit dans la partie Select().
    Je pense donc qu'il faut modifier le Select() en conséquence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var articles = julia.Article
    	.Select(p => new {p.ArtCCodeUvc,p.ArtCLibelle })
    	.Where(p => p.ArtCCodeUvc.StartsWith("2"))
    	.OrderBy(p => p.ArtCLibelle);
    Là je ne peux trier que sur p.ArtCCodeUvc ou p.ArtCLibelle, intelliSense ne me propose rien d'autre.

    Tatayo.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 118
    Points : 100
    Points
    100
    Par défaut
    en effet je pense que tu as raison.
    En passant par un type anonyme, on a donc un couple Id + Breed 1 qui est renvoyé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var qry10 = this.Collection
    .Select(p => new { ((ExternalAnimal)p).Id, ((ExternalAnimal)p).Breed1 })
    .Distinct()
    .OrderBy(p => p.Breed1);
    De ce fait le Distinct() ne fonctionne pas comme on voudrait :/

    De ce que j'en ai trouvé ici, il faut passer par la redéfinition d'un comparateur c'est un peu violent : https://dotnettutorials.net/lesson/l...stinct-method/

    Donc si je retire la sélection sur l'Id, ce code là fonctionne comme je veux on dirait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var qry10 = this.Collection
    .Select(p => new { ((ExternalAnimal)p).Breed1 })
    .Distinct()
    .OrderBy(p => p.Breed1).ToList();

  9. #9
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Moi je ne comprends pas ce que tu essaies d'obtenir comme données ? Pourquoi un distinct des races mais en y adjoignant l'id d'un des animaux (et pas l'id de la race, il peut-y avoir plusieurs animaux par race) ?

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 118
    Points : 100
    Points
    100
    Par défaut
    yop.
    Tu as raison @Noxen, récupérer l'ID de l'animal est juste un non sens.
    J'ai mélangé plusieurs besoins en fait.

    - d'un côté celui de pouvoir récupérer une liste unique de race d'animaux
    - de l'autre des requêtes pour récupérer des listes d'animaux selon un critère tiers (race, date de naissance, sexe...)

    Là je dirais que je suis bon dans mes besoins, faut juste que je tri un peu mes tests Linq sur mon jeu de test. Merci à tous les 2 pour l'aide

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

Discussions similaires

  1. Requête linq jointure
    Par oyigit dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2010, 16h02
  2. Réponses: 0
    Dernier message: 29/04/2009, 16h35
  3. Réponses: 7
    Dernier message: 06/04/2009, 16h29
  4. Colle sur un tri dans une requête linq to sql
    Par boby62423 dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2009, 10h01
  5. Réponses: 7
    Dernier message: 10/02/2008, 11h56

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