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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Orne (Basse Normandie)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 122
    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 : 170
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 confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 469
    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 confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Orne (Basse Normandie)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 122
    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 confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 469
    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 confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 469
    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 confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Orne (Basse Normandie)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 122
    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();

+ 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