Linq to SQL (complex join/group by/count)

Pagina: 1
Acties:

Onderwerpen


  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
Ik zit al een tijdje te worstelen met de volgende query:

SQL:
1
2
3
4
5
SELECT dg.id,dg.[group],dg.active,count(d.id) As Downloads
FROM DownloadGroups dg
JOIN download_downloadgroups dgl on dgl.DownloadGroupID = dg.ID
JOIN Downloads d ON d.ID = dgl.DownloadID
GROUP BY dg.id,dg.[group],dg.active

In VB.NET met Linq ziet het er zo uit:

Visual Basic .NET:
1
2
3
4
5
6
7
Dim NKDC As New nickkus_nickkustersDataContext
        Dim DGs = From dg In NKDC.DownloadGroups _
                  Join dgl In NKDC.download_downloadgroups _
                  On dgl.DownloadGroupID Equals dg.ID _
                  Join dl In NKDC.Downloads _
                  On dl.ID Equals dgl.DownloadID _
                  Group dg, dl By dg.ID, dg.[Group], dg.Active Into Cnt = Count(d.ID)

Het hele goedje klopt (volgens mij) tot aan "Into Cnt = Count(d.ID)", dat stukje vindt ie niet leuk.

Ik heb de volgende sites ff gecheckt, maar ik kom er niet uit

http://dotnetslackers.com...-horst.aspx&id=72021&b=25
http://knol.google.com/k/...nq-to-sql/9r4tqiuaz279/3#
http://msdn.microsoft.com/en-us/vbasic/bb737926.aspx

Iemand nog een ideetje?

NKCSS - Projects - YouTube


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
Waarom vind ie dat niet leuk .... ?
Foutmeldingen ?

Nu ben ik niet zo bekend met Linq To Sql, maar die Into lijkt me daar toch maar raar staan ... Normaal gezien moet je toch ook een select clause hebben ?

code:
1
2
....
Into Cnt select count(dl.Id)

Zoiets zou mij iig al wat logischer lijken, maar, zoals reeds gezegd, mijn kennis van Linq to Sql is niet echt dat.

https://fgheysels.github.io/


  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
whoami schreef op donderdag 27 november 2008 @ 19:54:
Waarom vind ie dat niet leuk .... ?
Foutmeldingen ?

Nu ben ik niet zo bekend met Linq To Sql, maar die Into lijkt me daar toch maar raar staan ... Normaal gezien moet je toch ook een select clause hebben ?

code:
1
2
....
Into Cnt select count(dl.Id)

Zoiets zou mij iig al wat logischer lijken, maar, zoals reeds gezegd, mijn kennis van Linq to Sql is niet echt dat.
Ik ben afgegaan op wat de Microsoft pages, etc. zeggen (zie de linkjes). Als ik het aantal downloads dat gelinkt is onder een groep er niet bij pak heb ik het zo in elkaar staan, maar dat is nou net niet wat ik wil :)
Dan zou ik af kunnen met:
Visual Basic .NET:
1
Dim DGs = From dg In NKDC.DownloadGroups Select dg

Er moet idd nog een select clause bij, maar zolang het opbouwen van de Linq 'query' nog niet klaar is, was dat nog niet echt van toepassing.

[ Voor 8% gewijzigd door CMG op 27-11-2008 20:01 ]

NKCSS - Projects - YouTube


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:22
Zeg nu eerst eens:
a) wat je precies probeert te verwezenlijken
b) welke foutmeldingen je evt krijgt. Krijg je eigenlijk syntax-fouten, krijg je exceptions at runtime, of krijg je gewoon niet de resultaten waar je op gehoopt had ?

https://fgheysels.github.io/


  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
whoami schreef op donderdag 27 november 2008 @ 20:03:
Zeg nu eerst eens:
a) wat je precies probeert te verwezenlijken
b) welke foutmeldingen je evt krijgt. Krijg je eigenlijk syntax-fouten, krijg je exceptions at runtime, of krijg je gewoon niet de resultaten waar je op gehoopt had ?
a: Zelfde resultaat als de query in de startpost.
b: Bij het into gedeeltje mag ik geen count(d.id) gebruiken
code:
1
2
Definition of method 'Count' is not accessible in this context. 
Value of type 'System.Guid' cannot be converted to 'Boolean'.

Ik had die twee er niet bij gezet omdat het hier om het ophalen van de Count(d.id) gaat en ik iets syntactisch niet goed doe om die data op te halen maar nergens kan vinden hoe het wel zou moeten. Ik weet dus wat er fout is, maar niet wat er wel zou moeten staan en ik ben bang dat alleen iemand met gedegen Linq kennis dit weet.

[ Voor 7% gewijzigd door CMG op 27-11-2008 20:19 ]

NKCSS - Projects - YouTube


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je weet al dat je into moet gebruiken. Maar wat is er onduidelijk aan de uitleg van into? Wat wil je met die "=" bereiken daar? Werken in VB gecombineerde group by's zonder New? Waarom vraag je in de originele SQL om count(d.id) en niet gewoon count(*), dus Count() in LINQ?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
pedorus schreef op donderdag 27 november 2008 @ 21:52:
Je weet al dat je into moet gebruiken. Maar wat is er onduidelijk aan de uitleg van into? Wat wil je met die "=" bereiken daar? Werken in VB gecombineerde group by's zonder New? Waarom vraag je in de originele SQL om count(d.id) en niet gewoon count(*), dus Count() in LINQ?
Hoe select ik de count dan?
Visual Basic .NET:
1
2
3
4
5
6
Dim DGs = From dg In NKDC.DownloadGroups _
                        Join dgl In NKDC.download_downloadgroups _
                        On dgl.DownloadGroupID Equals dg.ID _
                        Join dl In NKDC.Downloads _
                        On dl.ID Equals dgl.DownloadID _
                        Group By Key = New With {dg.ID, dg.Group, dg.Active} Into Group Select Key, Count()


mag niet. Als ik ,Count() weglaat heb ik nog steeds het zelfde als

Visual Basic .NET:
1
Dim DGs = From dg In NKDC.DownloadGroups Select dg


of

Visual Basic .NET:
1
2
3
4
5
6
        Dim DGs = From dg In NKDC.DownloadGroups _
                  Join dgl In NKDC.download_downloadgroups _
                  On dgl.DownloadGroupID Equals dg.ID _
                  Join dl In NKDC.Downloads _
                  On dl.ID Equals dgl.DownloadID _
                  Group dg, dl By dg.ID, dg.[Group], dg.Active Into Any()

NKCSS - Projects - YouTube


  • pedorus
  • Registratie: Januari 2008
  • Niet online
group ... by ... into ... werkt blijkbaar anders in VB dan in c#. Wellicht kun je zelfs "Into Count()" doen. Of "Select Group, Group.Count()". Of "Into g = Group Select New With {g.Key, .Cnt = g.Count()}".

Misschien werkt ook je originele query wel als je d.ID weghaalt, ik heb hier geen VB om het te testen, en heb al tijden niet meer met VB gewerkt... :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
pedorus schreef op donderdag 27 november 2008 @ 23:35:
group ... by ... into ... werkt blijkbaar anders in VB dan in c#. Wellicht kun je zelfs "Into Count()" doen. Of "Select Group, Group.Count()". Of "Into g = Group Select New With {g.Key, .Cnt = g.Count()}".

Misschien werkt ook je originele query wel als je d.ID weghaalt, ik heb hier geen VB om het te testen, en heb al tijden niet meer met VB gewerkt... :)
Group.Count is idd het beoogde. Helaas kan dat weer niet in de New With, waardoor je twee properties moet uitlezen, maar het is beter dan twee losse Linq queries schrijven.

Als iemand nog een elegantere oplossing weet, laat het me aub weten.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        Dim DGs = From dg In NKDC.DownloadGroups _
                  Join dgl In NKDC.download_downloadgroups _
                  On dgl.DownloadGroupID Equals dg.ID _
                  Join dl In NKDC.Downloads _
                  On dl.ID Equals dgl.DownloadID _
                  Group dg, dl By dg.ID, dg.[Group], dg.Active _
                  Into Any() _
                  Select Group, Group.Count

        Dim altDGs = From dg In NKDC.DownloadGroups _
                        Join dgl In NKDC.download_downloadgroups _
                        On dgl.DownloadGroupID Equals dg.ID _
                        Join dl In NKDC.Downloads _
                        On dl.ID Equals dgl.DownloadID _
                        Group By DownloadGroup = _
                        New With {dg.ID, dg.Group, dg.Active} _
                        Into Group _
                        Select DownloadGroup, Group.Count

[ Voor 4% gewijzigd door CMG op 28-11-2008 00:24 ]

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
Ok, ik heb de 'elegantere' manier ook gevonden, door gewoon een sub query te gebruiken is het mogelijk om ook de count in je anonymous type op te nemen.

Visual Basic .NET:
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
    Friend Shared Function GetArticles() As List(Of ArticleInfo)
        Dim Result As New List(Of ArticleInfo)
        Dim NKDC As New nickkus_nickkustersDataContext
        Dim Arts = From a In NKDC.Articles _
                   Select New With _
                   { _
                        a.ID, a.Subject, a.ArticleGenre.Genre, _
                        a.ItemCode, a.Active, a.sysCreated, _
                        a.sysModified, .Versions = _
                        ( _
                            From h In NKDC.ArticleHistories _
                            Where h.ArticleID = a.ID _
                            Select h _
                        ).Count, .Views = _
                        ( _
                            From v In NKDC.ArticleViews _
                            Where v.ArticleID = a.ID _
                            Select v _
                        ).Count _
                    }
        For Each A In Arts.ToList
            Dim AI As New ArticleInfo
            AI.ID = A.ID
            AI.Subject = A.Subject
            AI.ArticleGenre = A.Genre
            AI.ItemCode = A.ItemCode
            AI.Active = A.Active
            AI.Created = A.sysCreated
            AI.Modified = A.sysModified
            AI.Versions = A.Versions
            AI.Views = A.Views
            Result.Add(AI)
        Next
        Return Result
    End Function
...
Public Structure ArticleInfo
    Public ID As Integer
    Public Subject As String
    Public ArticleGenre As String
    Public ItemCode As String
    Public Active As Boolean
    Public Created As DateTime
    Public Modified As DateTime
    Public Versions As Integer
    Public Views As Integer
End Structure


Nu vraag ik me alleen af, is het ook mogelijk om Linq zelf als return type de ArticleInfo structure te laten gebruiken ipv zelf property voor property over te zetten? Ik heb het idee dat het mogelijk moet zijn.

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
CMG schreef op vrijdag 28 november 2008 @ 10:48:
Nu vraag ik me alleen af, is het ook mogelijk om Linq zelf als return type de ArticleInfo structure te laten gebruiken ipv zelf property voor property over te zetten? Ik heb het idee dat het mogelijk moet zijn.
Ik ook, "If you are using a loop, you're doing it wrong.". :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
CMG schreef op vrijdag 28 november 2008 @ 10:48:
Ok, ik heb de 'elegantere' manier ook gevonden, door gewoon een sub query te gebruiken is het mogelijk om ook de count in je anonymous type op te nemen.

Visual Basic .NET:
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
    Friend Shared Function GetArticles() As List(Of ArticleInfo)
        Dim Result As New List(Of ArticleInfo)
        Dim NKDC As New nickkus_nickkustersDataContext
        Dim Arts = From a In NKDC.Articles _
                   Select New With _
                   { _
                        a.ID, a.Subject, a.ArticleGenre.Genre, _
                        a.ItemCode, a.Active, a.sysCreated, _
                        a.sysModified, .Versions = _
                        ( _
                            From h In NKDC.ArticleHistories _
                            Where h.ArticleID = a.ID _
                            Select h _
                        ).Count, .Views = _
                        ( _
                            From v In NKDC.ArticleViews _
                            Where v.ArticleID = a.ID _
                            Select v _
                        ).Count _
                    }
        For Each A In Arts.ToList
            Dim AI As New ArticleInfo
            AI.ID = A.ID
            AI.Subject = A.Subject
            AI.ArticleGenre = A.Genre
            AI.ItemCode = A.ItemCode
            AI.Active = A.Active
            AI.Created = A.sysCreated
            AI.Modified = A.sysModified
            AI.Versions = A.Versions
            AI.Views = A.Views
            Result.Add(AI)
        Next
        Return Result
    End Function
...
Public Structure ArticleInfo
    Public ID As Integer
    Public Subject As String
    Public ArticleGenre As String
    Public ItemCode As String
    Public Active As Boolean
    Public Created As DateTime
    Public Modified As DateTime
    Public Versions As Integer
    Public Views As Integer
End Structure


Nu vraag ik me alleen af, is het ook mogelijk om Linq zelf als return type de ArticleInfo structure te laten gebruiken ipv zelf property voor property over te zetten? Ik heb het idee dat het mogelijk moet zijn.
Yay, ook laatste dingetje getackled.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Friend Shared Function GetArticles() As List(Of ArticleInfo)
        Dim NKDC As New nickkus_nickkustersDataContext
        Dim Arts = From a In NKDC.Articles _
                   Select New ArticleInfo With {.ID = a.ID, .Subject = a.Subject, .ArticleGenre = a.ArticleGenre.Genre, .ItemCode = a.ItemCode, _
                                          .Active = a.Active, .Created = a.sysCreated, .Modified = a.sysModified, .Versions = _
             ( _
                 From h In NKDC.ArticleHistories _
                 Where h.ArticleID = a.ID _
                 Select h _
             ).Count, .Views = _
             ( _
                 From v In NKDC.ArticleViews _
                 Where v.ArticleID = a.ID _
                 Select v _
             ).Count}
        Return Arts.ToList
    End Function


Hoop dat iemand hier nog een keer wat aan heeft. Ik zal in ieder geval binnenkort een stukje gaan schrijven op mijn site over dit gedoe, ben blij dat het allemaal gelukt is.

UPDATE
Nu ik terug kijk naar wat ik gepost heb is alleen New With veranderd in New ArticleInfo. Dat dit niet meteen duidelijk was komt doordat je geen intellisense hebt bij het zetten van de attributes.

[ Voor 3% gewijzigd door CMG op 28-11-2008 11:25 ]

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024
Linkje was niet echt relevant hier, maar wel een grappig artikel.

NKCSS - Projects - YouTube

Pagina: 1