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 :

[Linq] Équivalent SQL GroupBy


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut [Linq] Équivalent SQL GroupBy
    Bonjour ,

    J'ai une list de cette forme :

    Cate1 Cate2 Nom Value
    ----------------------------------
    Blanc Liquide Lait 50
    Blanc Liquide Pastis 100
    Blanc Solide glace 200
    Noir Gaz Charbon 50
    Noir Solide réglisse 100


    J'aimerai bien récupérer la somme des "Cate 2" par "Cate1", exemple

    Cate1 Cate2 Somme
    ----------------------------
    Blanc Liquide 150
    Blanc Solide 200
    Noir Gaz 50
    Noir Solide 100

    En SQL je ferais "Select Cate1, Cate2, Sum(Value) as Somme From Table GroupBy Cate2

    Comment obtenir l'équivalent en Linq ?

    Merci d'avance

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    Citation Envoyé par pitipilot Voir le message
    J'aimerai bien récupérer la somme des "Cate 2" par "Cate1"
    Non, tu aimerais récupérer les sommes des "value" regroupées par "Cate1" et "Cate2".

    Citation Envoyé par pitipilot Voir le message
    En SQL je ferais "Select Cate1, Cate2, Sum(Value) as Somme From Table GroupBy Cate2
    Et tu aurais deux erreurs ^^
    - "GROUP BY" est en deux mots,
    - dans ta sélection tu ne peux mettre que des champs de regroupement ou des fonctions d'agrégat.

    Sinon en LINQ tu peux voir la définition du GroupBy sur la MSDN (même si c'est pas très parlant j'avoue).
    Je suis pas spécialiste du LINQ (en fait je connais pas), mais si j'ai 5' (et que personne ne répond d'ici là) je regarde ça.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    quelque chose comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    private void test()
            {
                List<Data> datas = new List<Data>();            
                datas.Add(new Data("Blanc","Liquide",50));
                datas.Add(new Data("Blanc", "Liquide", 100));
                datas.Add(new Data("Blanc", "Solide,", 200));
                datas.Add(new Data("Noir", "Gaz", 50));
                datas.Add(new Data("Noir", "Solide", 100));
     
                var summary = from p in datas
                              let k = new
                              {
                                  //try this if you need a date field 
                                  //   p.SaleDate.Date.AddDays(-1 *p.SaleDate.Day - 1)
                                  Categorie = p.Cate1
                              }
                              group p by k into t
                              select new
                              {
                                  Categorie = t.Key.Categorie,
                                  Qty = t.Sum(p => p.Value)
                              };
     
                foreach (var item in summary)
                    Console.WriteLine(item);
     
            }
     
    public class Data
        {
            private string cate1;
            private string cate2;
            private int value =0;
     
            public    Data(string p1,string p2,int p3)
        {
            // TODO: Complete member initialization
        cate1 = p1;
        cate2= p2;
        value = p3;
            }
     
            public int Value
            {
                get { return value; }
                set { value = this.value; }
            }
     
            public string Cate2
            {
                get { return cate2; }
                set { cate2 = value; }
            }
     
            public string Cate1
            {
                get { return cate1; }
                set { cate1 = value; }
            }
     
        }
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Pour obtenir exactement le même résultat :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var q = (from item in data
    	 group item by new { item.Cate2, item.Cate1 } into grp
    	 select new
    	 {
    		 grp.Key.Cate1,
    		 grp.Key.Cate2,
    		 Somme = grp.Sum(x => x.Value)
    	 });

    On obtient :
    { Cate1 = "Blanc", Cate2 = "Liquide", Somme = 150 }
    { Cate1 = "Blanc", Cate2 = "Solide", Somme = 200 }
    { Cate1 = "Noir", Cate2 = "Gaz", Somme = 50 }
    { Cate1 = "Noir", Cate2 = "Solide", Somme = 100 }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    J'ai à peu près la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
                // pas besoin de mettre la class Produit c'est juste une représentation de l'exemple.
                public List<Produit> prods = new List<Produit>();
                prods.Add(new Produit("Blanc", "Liquide", "Lait", 50));
                prods.Add(new Produit("Blanc", "Liquide", "Pastis", 100));
                prods.Add(new Produit("Blanc", "Solide", "glace", 200));
                prods.Add(new Produit("Noir", "Gaz", "Charbon", 50));
                prods.Add(new Produit("Noir", "Gaz", "pétrol", 30));
                prods.Add(new Produit("Noir", "Solide", "réglisse", 100));
     
                string ret = "";
                var sums = from prod in prods
                           group prod by new { prod.Cate1, prod.Cate2 }
                           into prodsum
                             select new {
                                 prodsum.Key.Cate1,
                                 prodsum.Key.Cate2,
                                 Somme = prodsum.Sum(prod => prod.Valeur)
                             };
     
                foreach (var p in sums)
                    ret += p.Cate1 + " - " + p.Cate2 + " - " + p.Somme + "\r\n";
    Plus je connais de langages, plus j'aime le C.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    J'ai essayé la solution de DotNetMatt et ça a marché du premier coup !

    Merci aux autres aussi pour vos solutions, je ne trouve pas le Linq très facile d'accès par rapport à du SQL suis-je le seul a avoir ce ressenti ?

    jopopmk :d) Je ne vois pas trop le but de ton intervention à part faire "péter les galons" (à moins que je me trompe c'est possible). Oui ma requête SQL est fausse en pseudo code mais ça ne reste que du pseudo code :p.

  7. #7
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Le coeur de ta requête c'est le regroupement.

    Si je veux bien passer sur le GroupBy qui peut relever d'un éventuel pseudo-code, le mauvais regroupement et ta phrase explicative qui laissait supposer que tu ne comprenais pas ce que tu faisais, nécessitaient une correction. Maintenant je veux bien te laisser dans l'ignorance à l'avenir, suffit de demander, je suis un gars sympa
    Plus je connais de langages, plus j'aime le C.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/03/2010, 23h32
  2. [Linq 2 SQL] Problème de modélisation
    Par tomlev dans le forum Accès aux données
    Réponses: 5
    Dernier message: 12/02/2008, 23h29
  3. [Linq to sql] db.add() ?
    Par telynette dans le forum Accès aux données
    Réponses: 2
    Dernier message: 08/02/2008, 19h54
  4. [Linq to SQL] Refresh du dbml
    Par zeavan dans le forum Visual Studio
    Réponses: 5
    Dernier message: 02/01/2008, 10h15
  5. équivalent SQL*Loader pour FB / IB
    Par djeant dans le forum Outils
    Réponses: 9
    Dernier message: 10/01/2005, 21h26

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