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

Linq Discussion :

Comment utilisez Group By et Sum en Linq


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut Comment utiliser Include() avec Group By
    Bonjour,

    Je cherche à appliquer un Group By sur 2 colonnes à la requête Linq suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Return (From parution In Context.parutions.Include("messages").Include("messages.plansmedias.campagnes").Include("messages.plansmedias.campagnes.annonceurs").Include("messages.tarifs.produitsvendus.supports.medias") _
                    Where parution.DateParution.StartsWith(argYear & "-" & argMonth) And parution.messages.tarifs.produitsvendus.distributions.fournisseurs.IdFournisseur = 8 _
                    Select parution).ToList
    Je suis très novice en dotnet surtout avec Linq que j'ai tout de suite eu le coup de foudre
    Je veux faire un Group By sur messages.plansmedias.campagnes.annonceurs.IdAnnonceur et messages.plansmedias.campagnes.IdCampagne
    Mais je ne sais pas quoi d'abord mettre après Into

    Ensuite il y a des sommes à faire pour les groupe by sur la table messages, 2 sommes Sum(messages.Montant) et Sum(messages.NombreParution)

    Il s'agit ici de Linq To Entities d'une BD liée de clés étrangères
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Par exemple, où est le hic dans ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	Public Shared Function GetParutionsByMonthYearFournisseur(Optional ByVal argMonth As String = "", Optional ByVal argYear As String = "") As List(Of parutions)
            Return (From parution In Context.parutions.Include("messages").Include("messages.plansmedias.campagnes").Include("messages.plansmedias.campagnes.annonceurs").Include("messages.tarifs.produitsvendus.supports.medias") _
            Where parution.DateParution.StartsWith(argYear & "-" & argMonth) And parution.messages.tarifs.produitsvendus.distributions.fournisseurs.IdFournisseur = 8 _
            Group By parution.messages.plansmedias.campagnes.IdCampagne _
            Into Group).ToList
    	End Function
    Avant l'utilisation de Group By Into, ça marchait mais après
    Value of type 'System.Collections.Generic.List(Of <anonymous type>)' cannot be converted to 'System.Collections.Generic.List(Of LogicielMediaBO.parutions)'.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  3. #3
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Citation Envoyé par randriano Voir le message
    Value of type 'System.Collections.Generic.List(Of <anonymous type>)' cannot be converted to 'System.Collections.Generic.List(Of LogicielMediaBO.parutions)'.
    Ce genre d'erreur arrive lorsqu'on oublie un select dans la requête, du coup le ToList ne peut fonctionner.

    En espérant t'avoir aidé.

  4. #4
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Là je comprends le message d'erreur mais je ne sais pas quoi mettre après Select ici

    Si je mets "Select parution", j'ai l'erreur
    Name 'parution' is either not declared or not in the current scope.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 90
    Par défaut
    Je n'ai jamais utilisé LinQ seulement tapée mes requêtes à la main, mais normalement c'est la même chose donc. Quand tu fais un Group By tu es obligé de le faire sur tout les éléments de la requête sauf ceux dont tu fais la somme

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select SUM(champs1), champs2, champs3, champs4 from table 1 group by champs2, champs3, champs4 having champs2= and champ3 =;

  6. #6
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    La requête que j'ai envie de faire est assez clair en SQL: group by sur 2 champs de 2 tables, mais avec une jointure sur plus de 8 tables donc très difficile

    C'est la raison du choix de Linq, il suffit d'utiliser des Include(), de plus je suis sous Linq to Entities

    Mon soucis c'est que je suis novice en Linq et je n'arrive même pas à utiliser un Group By sur un champ

    Dépêche: http://geekswithblogs.net/SudheersBl...11/132758.aspx
    Là au moins j'ai la confirmation que Include() ne va pas avec Group By mais comment esquiver cela? Est-il possible de grouper après le résultat d'un query utilisant Include() comme je fais?
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  7. #7
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Wow, tu as réussi à faire tout ce code ainsi d'avoir compris mes données, chapeau mais je ne sais pas si c'est moi qui copie bêtement car j'ai toujours le même nombre de lignes de résultat que tmpcolParutionsMonthYear

    En fait c'est que je ne comprends pas avec le GROUP BY en LINQ c'est que ne peut-on plus faire des requêtes comme (en sql):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Fournisseur, FournisseurId, Campagne, Media, Format, Sum(NombreParution), Sum(MontantNet), Sum(MontantNet)*Commission/100
    From tmpcolParutionsMonthYear
    GROUP BY FournisseurId, Campagne
    Je ne veux qu'obtenir tous mes champs avec les nouveaux calculés
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  8. #8
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    À moins de dire une énorme boulette mais il ne me semble pas cette requête là n'existe pas (ou alors dans une norme ancienne du SQL voire dans du SQL non-normé)

    En SQL, tout champ qui n'est pas le résultat d'une agrégation (COUNT, SUM, AVG ...) se doit de figurer dans la clause GROUP BY, si l'on souhaite pouvoir le mettre dans la clause SELECT, ainsi sont correctes les requêtes suivantes :

    Code SQL : 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
     
    --Requete 1
    SELECT
        FournisseurId,
        Campagne,
        SUM(NombreParution) AS TotalParution,
        SUM(MontantNet) AS MontantNetTotal,
    FROM
        tmpcolParutionsMonthYear
    GROUP BY
        FournisseurId,
        Campagne
     
    --Requete 2
    SELECT
        SUM(NombreParution) AS TotalParution,
        SUM(MontantNet) AS MontantNetTotal,
    FROM
        tmpcolParutionsMonthYear
    GROUP BY
        FournisseurId,
        Campagne
     
    --Requete 3
    SELECT
        FournisseurId,
        Campagne,
        SUM(NombreParution) AS TotalParution,
        SUM(MontantNet) AS MontantNetTotal,
        SUM(MontantNet) * Commission / 100 As TotalCommission
    FROM
        tmpcolParutionsMonthYear
    GROUP BY
        FournisseurId,
        Campagne,
        Commission

    Bon après je ne fais pas du SQL tous les jours, donc s'il y a réellement un moyen, je m'excuserais d'avoir dis que c'était faux, mais il ne me semble vraiment pas.

  9. #9
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Si ça marche mais en effet, c'est peut-être non-normé, on ne saurait quoi mettre dans ces champs, j'ai remarqué que c'est la 1ère valeur trouvée avant le groupement

    Une question: que contient Group car il semble que c'est un array? Pourquoi en VB.NET on ne peut pas faire Into G, Into uiop, etc comme en C# mais juste Into Group
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  10. #10
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Group est effectivement un tableau que j'utilise ainsi:
    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
     
     
    			colParutionsYear_tmp = (From p In tmpcolParutionsYear _
    			  Order By p.FournisseurId, p.Mois, p.Media, p.Format _
    			 Group By p.FournisseurId, p.Mois, p.Media, p.Format _
    			 Into Group _
    			 Select New ParutionsYear With {.Fournisseur = Group(0).Fournisseur, _
    			 .FournisseurId = FournisseurId, _
    			  .Mois = Mois, _
    			  .Media = Media, _
    			  .Format = Format, _
    			  .NombreParution = Group.Sum(Function(p) p.NombreParution), _
    			  .MontantNet = Group.Sum(Function(p) p.MontantNet), _
    			  .Commission = (.MontantNet * Group(0).Commission) / 100 _
    			  } _
    			).ToList
    ici Group(0).Fournisseur
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

Discussions similaires

  1. Comment utilisez-vous Outlook
    Par Dolphy35 dans le forum Outlook
    Réponses: 41
    Dernier message: 29/12/2024, 12h30
  2. Comment programmer la construction d'une requête LINQ ?
    Par SpongeRobert dans le forum Linq
    Réponses: 4
    Dernier message: 01/09/2009, 10h05
  3. Réponses: 7
    Dernier message: 06/04/2009, 16h29
  4. Réponses: 3
    Dernier message: 29/01/2009, 08h49
  5. GROUP BY et SUM
    Par bchristo dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/12/2005, 15h19

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