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

VB.NET Discussion :

Utilisation de LINQ pour interroger une dataTable


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Par défaut Utilisation de LINQ pour interroger une dataTable
    Bonjour,

    J'ai un soucis avec du code LINQ (sous VB.Net) pour une datatable.

    J'ai la datatable suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim dtCommunications As New DataTable()
            dtCommunications.Columns.Add("CommunicationID", GetType(String))
            dtCommunications.Columns.Add("PIN", GetType(String))
            dtCommunications.Columns.Add("Date Comm", GetType(Date))
            dtCommunications.Columns.Add("PJ Image", GetType(Integer))
            dtCommunications.Columns.Add("PJ Audio", GetType(Integer))
    Et j'ai des données dans cette datatable.

    Je cherche à récupérer, pour chaque couple de CommunicationID et de PIN les valeurs suivantes :
    - La Date Comm minimum
    - La Date Comm maximum
    - La somme des valeurs de PJ Images
    - La somme des valeurs de PJ Audio
    - Le nombre d'enregistrements

    Sous SQL, cela correspondrait à cette requête :
    Select CommunicationID, PIN, Min(Date Comm), Max(Date Comm), Sum(PJ Image), Sum(PJ Audio), count(*)
    from dtCommunications
    Group by CommunicationID, PIN

    J'ai demandé à ChatGPT, et il me donne le code LINQ suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim query = From row2 In dtCommunications.AsEnumerable()
                        Group row2 By Key = New With {
                    .CommunicationID = row2.Field(Of String)("CommunicationID"),
                    .PIN = row2.Field(Of String)("PIN")
                } Into Group
                        Select New With {
                    .CommunicationID = Key.CommunicationID,
                    .PIN = Key.PIN,
                    .MinDateComm = Group.Min(Function(r) r.Field(Of Date)("Date Comm")),
                    .MaxDateComm = Group.Max(Function(r) r.Field(Of Date)("Date Comm")),
                    .SumPJImage = Group.Sum(Function(r) r.Field(Of Integer)("PJ Image")),
                    .SumPJAudio = Group.Sum(Function(r) r.Field(Of Integer)("PJ Audio")),
                    .RecordCount = Group.Count()
                }
    Mais ça ne fonctionne pas. Les résultats ne sont pas groupés comme je le souhaite...

    Voici le code complet, avec des données d'exemples :
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    ' Creation de la table qui va contenir toutes les Conversations
            Dim dtCommunications As New DataTable()
            dtCommunications.Columns.Add("CommunicationID", GetType(String))
            dtCommunications.Columns.Add("PIN", GetType(String))
            dtCommunications.Columns.Add("Date Comm", GetType(Date))
            dtCommunications.Columns.Add("PJ Image", GetType(Integer))
            dtCommunications.Columns.Add("PJ Audio", GetType(Integer))
     
            Dim row As DataRow
     
            ' Adding this new line to the Datatable
            row = dtCommunications.NewRow()
            row("CommunicationID") = "12345"
            row("PIN") = "DEF"
            row("Date Comm") = "2020/01/01 12:00:00"
            row("PJ Image") = 1
            row("PJ Audio") = 0
            dtCommunications.Rows.Add(row)
     
            row = dtCommunications.NewRow()
            row("CommunicationID") = "12345"
            row("PIN") = "DEF"
            row("Date Comm") = "2020/01/01 12:05:00"
            row("PJ Image") = 0
            row("PJ Audio") = 0
            dtCommunications.Rows.Add(row)
     
            row = dtCommunications.NewRow()
            row("CommunicationID") = "12345"
            row("PIN") = "DEF"
            row("Date Comm") = "2020/01/01 12:10:00"
            row("PJ Image") = 1
            row("PJ Audio") = 1
            dtCommunications.Rows.Add(row)
     
            row = dtCommunications.NewRow()
            row("CommunicationID") = "12345"
            row("PIN") = "ABC"
            row("Date Comm") = "2020/01/01 12:10:00"
            row("PJ Image") = 0
            row("PJ Audio") = 1
            dtCommunications.Rows.Add(row)
     
            row = dtCommunications.NewRow()
            row("CommunicationID") = "12345"
            row("PIN") = "ABC"
            row("Date Comm") = "2020/01/01 12:15:00"
            row("PJ Image") = 1
            row("PJ Audio") = 3
            dtCommunications.Rows.Add(row)
     
            Dim query = From row2 In dtCommunications.AsEnumerable()
                        Group row2 By Key = New With {
                    .CommunicationID = row2.Field(Of String)("CommunicationID"),
                    .PIN = row2.Field(Of String)("PIN")
                } Into Group
                        Select New With {
                    .CommunicationID = Key.CommunicationID,
                    .PIN = Key.PIN,
                    .MinDateComm = Group.Min(Function(r) r.Field(Of Date)("Date Comm")),
                    .MaxDateComm = Group.Max(Function(r) r.Field(Of Date)("Date Comm")),
                    .SumPJImage = Group.Sum(Function(r) r.Field(Of Integer)("PJ Image")),
                    .SumPJAudio = Group.Sum(Function(r) r.Field(Of Integer)("PJ Audio")),
                    .RecordCount = Group.Count()
                }
     
            ' Créez une nouvelle DataTable pour stocker les résultats.
            Dim dtResult As New DataTable()
            dtResult.Columns.Add("CommunicationID", GetType(String))
            dtResult.Columns.Add("PIN", GetType(String))
            dtResult.Columns.Add("MinDateComm", GetType(Date))
            dtResult.Columns.Add("MaxDateComm", GetType(Date))
            dtResult.Columns.Add("SumPJImage", GetType(Integer))
            dtResult.Columns.Add("SumPJAudio", GetType(Integer))
            dtResult.Columns.Add("RecordCount", GetType(Integer))
     
            ' Remplissez la DataTable résultante avec les données du résultat de la requête LINQ.
            For Each result In query
                dtResult.Rows.Add(result.CommunicationID, result.PIN, result.MinDateComm, result.MaxDateComm, result.SumPJImage, result.SumPJAudio, result.RecordCount)
            Next
    Je voudrais avoir les résultats suivants :
    12345 - DEF - 2020/01/01 12:00:00 - 2020/01/01 12:10:00 - 2 - 1 - 3
    12345 - ABC - 2020/01/01 12:10:00 - 2020/01/01 12:15:00 - 1 - 4 - 2

    Au lieu de cela, il me ressort chaque enregistrement de départ (les 5 dans l'exemple donné) :
    12345 - DEF - 2020/01/01 12:00:00 - 2020/01/01 12:00:00 - 1 - 0 - 1
    12345 - DEF - 2020/01/01 12:05:00 - 2020/01/01 12:05:00 - 0 - 1 - 1
    12345 - DEF - 2020/01/01 12:10:00 - 2020/01/01 12:10:00 - 1 - 0 - 1
    12345 - ABC - 2020/01/01 12:10:00 - 2020/01/01 12:10:00 - 0 - 1 - 1
    12345 - ABC - 2020/01/01 12:15:00 - 2020/01/01 12:15:00 - 1 - 3 - 1

    Je ne comprends pas ce qui cloche...

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Citation Envoyé par jjcasalo Voir le message

    J'ai demandé à ChatGPT, et il me donne ....
    Quand est-ce que les gens vont comprendre que ChatGPT, n'est pas fiable ?

    Tu as cinq lignes parce que tu ne précises pas quelles colonnes sont tes clés de regroupement.
    J'ai simplifié ton code de remplissage de la table et corrigé ta requête Linq pour lui préciser les colonnes clés.
    Le reste ne devrait pas varier.
    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
     
            Dim dtCommunications As New DataTable()
            dtCommunications.Columns.Add("CommunicationID", GetType(String))
            dtCommunications.Columns.Add("PIN", GetType(String))
            dtCommunications.Columns.Add("Date Comm", GetType(Date))
            dtCommunications.Columns.Add("PJ Image", GetType(Integer))
            dtCommunications.Columns.Add("PJ Audio", GetType(Integer))
     
            dtCommunications.Rows.Add("12345", "DEF", New Date(2020, 1, 1, 12, 0, 0, DateTimeKind.Local), 1, 0)
            dtCommunications.Rows.Add("12345", "DEF", New Date(2020, 1, 1, 12, 5, 0, DateTimeKind.Local), 0, 0)
            dtCommunications.Rows.Add("12345", "DEF", New Date(2020, 1, 1, 12, 10, 0, DateTimeKind.Local), 1, 1)
            dtCommunications.Rows.Add("12345", "ABC", New Date(2020, 1, 1, 12, 10, 0, DateTimeKind.Local), 0, 1)
            dtCommunications.Rows.Add("12345", "ABC", New Date(2020, 1, 1, 12, 15, 0, DateTimeKind.Local), 1, 3)
     
            Dim query = From row In dtCommunications
                        Group row By grouped = New With {
                            Key .CommunicationID = row("CommunicationID"),
                            Key .PIN = row.Field(Of String)("PIN")
                            } Into Group
                        Select New With {
                            Key .CommunicationID = grouped.CommunicationID,
                            Key .PIN = grouped.PIN,
                            .MinDateComm = Group.Min(Function(r) r("Date Comm")),
                            .MaxDateComm = Group.Max(Function(r) r("Date Comm")),
                            .SumPJImage = Group.Sum(Function(r) r("PJ Image")),
                            .SumPJAudio = Group.Sum(Function(r) r("PJ Audio")),
                            .RecordCount = Group.Count()
                        }
    Edit :
    Les erreurs qu'a fait ChatPGT sont :
    • Utilisation du mot clé Key comme nom pour le regroupement.
    • Non utilisation du mot clé Key devant les colonnes CommunicationID et PIN dans le Group By
    • Mauvaise utilisation du mot clé Key dans le select (ceci est le résultat deux deux premières erreurs)


    Pour cette simple demande qui n'a rien de complexe, ce sont des fautes assez graves.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Par défaut
    Merci popo pour ta réponse.
    Heureusement que Chat GPT fait encore des erreurs...

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 561
    Par défaut
    Bonjour,
    Personnellement je n'ai vraiment rien compris,
    D'où proviennent les données ?
    Pourquoi créé un par un les champs du datatable?
    Pourquoi enrichir le datatable avec des données qui me semble venir d'un fichier plat?
    Et enfin pourquoi faire un group by du datatable?

    Tu vois je n'es rien compris !

Discussions similaires

  1. [Conception] Outil pour INTERROGER une base de donnees
    Par barthelv dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/05/2006, 15h23
  2. Réponses: 1
    Dernier message: 29/12/2005, 13h25
  3. Réponses: 4
    Dernier message: 12/09/2005, 19h23
  4. utiliser le quickreport et le sql pour interroger une table
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2005, 08h46
  5. Réponses: 8
    Dernier message: 23/03/2005, 19h28

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