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.