Bonjour,
J'ai un soucis avec du code LINQ (sous VB.Net) pour une datatable.
J'ai la datatable suivante :
Et j'ai des données dans cette datatable.
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))
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:
Mais ça ne fonctionne pas. Les résultats ne sont pas groupés comme je le souhaite...
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() }
Voici le code complet, avec des données d'exemples :
Je voudrais avoir les résultats suivants :
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
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.
Partager