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 :

Group By sur list avec NHibernate


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut Group By sur list avec NHibernate
    Bonjour à tous,

    Je travaille avec NHibernate et des requêtes multi-critères sur listes d'objets.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    l_zonesLosses = sessiondb.Linq<EntityPERTEZONE>().
                        Where(r => r.OBJ_TRANCHEHORAIRE.OFCLEUNIK == i_OFCLEUNIK &&
                        r.OBJ_TRANCHEHORAIRE.DATEDEBUT >= d_beginDate &&
                        r.OBJ_TRANCHEHORAIRE.DATEFIN <= d_endDate && 
                        r.OBJ_ZONE.OBJ_ENUMZONE.ENUMZONEVISIBLE == 1).
                        OrderBy(r => r.OBJ_ZONE.OBJ_ENUMZONE.EZCLEUNIK).
                        ThenBy(r => r.ZOCLEUNIK).
                        ThenBy(r => r.THCLEUNIK).
                        ToList<EntityPERTEZONE>();
    Seulement voilà, je chercher à rajouter une clause groupBy pour que la requête me retourne exactement la même chose, si ce n'est que les quantité soient groupée par nom de zone (A savoir OBJ_ZONE.NOMZONE).

    J'ai essayé de faire joujou en ajoutant un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .GroupBy(r => r.OBJ_ZONE.NOMZONE)
    mais il m'envoie sur les roses (et il a bien raison, j'pense faire n'importe quoi et être trop proche de la syntaxe SQL ...) et je parie qu'une chose ENOOORME m'échappe ! Avec la complétion VS, il me dit d'utiliser un "specific comparer" mais j'arrive pas à m'imaginer ce que c'est.

    De l'aide ? Merci d'avance !

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Salut,

    Je peux malheuresement pas tester sur ma machine donc je vais te donner l'idée générale.
    En fait lorsque tu fait un GroupBy tu associer tes résultats a un nouvel objet, ce qui te permettra de rajouter des choses du genre dans ta requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* group by */.Where(i=> i.Count() == 5 )
    Ensuite ta requete va te retourner un IEnumerable<tonGroupBy> et tu pourra ensuite parcourir a la fois tous tes GroupBy ainsi que tous tes objets dans ton GroupBy.
    J'espere que tu as compris le principe et que mon explication n'est pas trop confuse.

    Tu trouveras ton sésame ici: http://code.msdn.microsoft.com/LINQ-...uping-c62703ea
    Tu devrais pouvoir utiliser ceci sans probleme avec NHibernate.

    A+

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut
    Merci beaucoup pour la référence, je vais me pencher dessus, je vous tiendrai au courant de mon avancement là dessus Globalement, j'ai compris

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut
    Suite à ma requête du premier message, j'effectue ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IEnumerable<IGrouping<long, EntityPERTEZONE>> o_grouping = l_zonesLosses.GroupBy(r => r.OBJ_ZONE.EZCLEUNIK);
    J'obtiens donc un énum de tous les groupes que j'ai à disposition. Mais comment en exploiter mes objets de type EntityPERTEZONE ?

    Il y a quelque chose qui m'échappe

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    si tu enumeres sur ton o_grouping, tu obtiens un objet qui a une propriété long (ton EZCLEUNIK) et qui est lui même énumerable (tous les EntityPERTEZONE ayant cette EZCLEUNIK).

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 186
    Par défaut
    OK, résumons la situation :

    J'ai une requête qui me sort une liste d'enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    IList<EntityPERTEZONE> l_zonesLosses = new List<EntityPERTEZONE>();
     
    // Extract all ranges of hours which are inside our range of date and ordered as we want
                    l_zonesLosses = sessiondb.Linq<EntityPERTEZONE>().
                        Where(r => r.OBJ_TRANCHEHORAIRE.OFCLEUNIK == i_OFCLEUNIK &&
                        r.OBJ_TRANCHEHORAIRE.DATEDEBUT >= d_beginDate &&
                        r.OBJ_TRANCHEHORAIRE.DATEFIN <= d_endDate &&
                        r.OBJ_ZONE.OBJ_ENUMZONE.ENUMZONEVISIBLE == 1).
                        OrderBy(r => r.OBJ_ZONE.OBJ_ENUMZONE.EZCLEUNIK).
                        ThenBy(r => r.ZOCLEUNIK).
                        ThenBy(r => r.THCLEUNIK).
                        ToList<EntityPERTEZONE>();
    Cette requête me retourne une liste que j'afficherai dans un tableau, de la forme : Une ligne pour une zone, une colonne par tranche horaire, et la cellule qui contiendra le résultat.

    Mais certaines des lignes de mon tableau correspondent à une même zone du type, ZoneTest étant ma zone, TH pour tranche horaire (colonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             TH1   TH2   TH3   TH4   TH5 ...
    ZoneTest / 45 / 10 / 20 / 0 / 0 / ...
    ZoneTest / 0  /  12 / 8  / 1 / 0 / ...
    Je voudrais obtenir une seule ligne par zone comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
             TH1   TH2   TH3   TH4   TH5 ...
    ZoneTest / 45 / 22 / 28 / 1 / 0 / ...
    Donc, j'utilise un objet type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IList<IGrouping<long, EntityPERTEZONE>> o_grouping;
    qui va stocker mes groupes. Sur cet objet, j'utilise l'objet résultant de ma premiere requête en lui rajoutant une clause groupBy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    o_grouping = l_zonesLosses.GroupBy(r => r.OBJ_ZONE.ZOCLEUNIK & r.OBJ_ZONE.EZCLEUNIK).ToList();
    Puis j'énumère en ajoutant chaque resultat à ma liste, et j'imagine que c'est ici que je fais n'importe quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    IList<EntityPERTEZONE> l_zonesLossesGroup = new List<EntityPERTEZONE>();
    foreach (var group in o_grouping)
                    {
                        var key = group.Key;
                        List<EntityPERTEZONE> zonesGroups = group.ToList();
                        foreach (var EntityPerte in zonesGroups)
                        {
                            l_zonesLossesGroup.Add(EntityPerte);
                        }
                    }
    Ceci ne fonctionne pas, j'ai exactement le même résultat que dans ma première liste sans group by, et voici les causes possibles :

    1/ Je n'ai vraisemblablement rien compris à la clause groupBy
    2/ En enumerant le contenu via foreach, je casse les groupes et je reviens à ce que j'avais avant. Je n'ai pas compris la forme de l'objet groupBy
    3/ Tout est correct mais je groupe sur les mauvaises clés

    Any help ?

Discussions similaires

  1. [MySQL] Compteur sur liste avec fusion
    Par DevLqncer dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 02/08/2013, 13h37
  2. Problmème sur liste avec affichage Calendrier
    Par HGDL1 dans le forum SharePoint
    Réponses: 0
    Dernier message: 28/09/2007, 10h51
  3. filtre sur liste avec selection multiple
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/08/2007, 09h42
  4. PB avec group by sur union
    Par panini182 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2005, 17h58

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