[Linq to SQL] Group By met Join

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Na een tijdje niks meer met programmeren te maken hebben gehad probeer ik nu een vrij simpele SQL query om te zetten naar Linq to SQL:
code:
1
2
3
4
SELECT S.ServerName, MAX(M.Datum) AS 'Datum'
FROM Monitor AS M
INNER JOIN Server AS S ON M.ServerId = S.ServerId
GROUP BY S.ServerName


Ik heb nu zoiets:
code:
1
2
3
4
5
6
7
from m in db.Monitors
join s in db.Servers on m.ServerId equals s.ServerId
select new
{
   Datum = m.Datum,
   ServerName = s.ServerName
};


Hoe voeg ik de Group By toe en de Max(M.Datum) zodat ik dezelfde SQL query krijg in linq?
Ik heb al wat gerommeld met group by enzo, maar het wil niet lukken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En als ik 2 seconden google kom ik hier op uit...

code:
1
2
3
4
5
6
7
var categories =
      from p in products
      group p by p.Category into g
      select new {
            Category = g.Key,
            MostExpensivePrice = g.Group.Max(p => p.UnitPrice)
      };


En specifiek met een join:
code:
1
2
3
4
5
6
7
8
9
10
11
var query =
      from psc in prodDtcx.ProductSubcategory
      join p in prodDtcx.Product on psc.ProductSubcategoryID equals p.ProductSubcategoryID
      group psc by new {
            psc.Name,
            p.Color
      } into g
      select new {
            Color = g.Key.Color,
            ProductSubcategoryName = g.Key.Name
      };


Volgende keer zien we graag wat je dan hebt gerommeld en waarom dat dan volgens jou niet werkt.

[ Voor 108% gewijzigd door RobIII op 14-07-2009 11:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Rob, bedankt voor de informatie. Deze voorbeelden heb ik ook gevonden en toegepast, maar dan kan ik geen MAX functie toepassen. Dat is het probleem.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
JvdS schreef op dinsdag 14 juli 2009 @ 11:51:
maar dan kan ik geen MAX functie toepassen
Want :? Als je nou eens aangeeft welke foutmelding je krijgt, je LINQ query laat zien etc. Want nu is het voor ons ook maar raden natuurlijk.

[ Voor 29% gewijzigd door RobIII op 14-07-2009 11:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Linq query:
code:
1
2
3
4
5
6
7
8
9
var query = from t in (
from m in db.Monitors
join s in db.Servers on m.ServerId equals s.ServerId
select new {
   ServerName = s.ServerName,
   Datum = m.Datum
})
group t by t.ServerName into n
select n.Max();


Foutmelding: Could not format node 'New' for execution as SQL.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

het is 'group by ... new', niet 'new ... group by'. Lees je de voorbeelden wel? Kijk nog eens heel erg goed naar het voorbeeld van RobIII.

Bij Linq is select altijd het laatste onderdeel. Verder is dit redelijk basic Linq 2 SQL, dus misschien is een tutorial doorlezen niet zo'n gek idee.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
Erg gezellig forum is dit geworden in de loop der jaren.
Ik lees natuurlijk de voorbeelden! Anders zou ik het niet vragen.

Ik heb nu:
code:
1
2
3
4
5
6
7
8
9
10
var result = from m in db.Monitors
   join s in db.Servers on m.ServerId equals s.ServerId
  group m by new {
  ServerName = s.ServerName,
  Datum = m.Datum
} into g
select new {
  ServerName = g.Key.ServerName,
  Datum = g.Max(p => p.Datum)
};

De max zit op de verkeerde plek?

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
JvdS schreef op dinsdag 14 juli 2009 @ 13:19:
Ik heb nu:
code:
1
2
3
4
5
6
7
8
9
10
var result = from m in db.Monitors
   join s in db.Servers on m.ServerId equals s.ServerId
  group m by new {
  ServerName = s.ServerName,
  Datum = m.Datum
} into g
select new {
  ServerName = g.Key.ServerName,
  Datum = g.Max(p => p.Datum)
};

De max zit op de verkeerde plek?
'Verkeerde plek' is wellicht niet echt duidelijk, post dan de SQL query.

Ik denk dat deze beter werkt:
code:
1
2
3
var q = from m in db.Monitors
        group m by m.Server.ServerName into g
        select new { ServerName = g.Key, Datum = g.Max(m=>m.Datum)};

Maar niet getest, dus wellicht fout.
Niemand_Anders schreef op dinsdag 14 juli 2009 @ 12:32:
het is 'group by ... new', niet 'new ... group by'. Lees je de voorbeelden wel? Kijk nog eens heel erg goed naar het voorbeeld van RobIII.
Beetje vriendelijker mag wel.
Bij Linq is select altijd het laatste onderdeel. Verder is dit redelijk basic Linq 2 SQL, dus misschien is een tutorial doorlezen niet zo'n gek idee.
Wellicht is het geven van een goed antwoord ook een idee ipv nutteloze info te geven waar TS niets mee kan? (en 'select' is niet altijd het laatste onderdeel, FYI, zie C# 3.0 language spec, page 223-224, chapter 7.15)
RobIII schreef op dinsdag 14 juli 2009 @ 11:42:
En als ik 2 seconden google kom ik hier op uit...

code:
1
2
3
4
5
6
7
var categories =
      from p in products
      group p by p.Category into g
      select new {
            Category = g.Key,
            MostExpensivePrice = g.Group.Max(p => p.UnitPrice)
      };
g.Group ? Lijkt me oude pre-RTM syntax. 'g' is de IEnumerable<IGrouping<TKey, TItem>>, niet een property van g.

[ Voor 19% gewijzigd door EfBe op 14-07-2009 13:39 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
JvdS schreef op dinsdag 14 juli 2009 @ 13:19:
Erg gezellig forum is dit geworden in de loop der jaren.
Ik lees natuurlijk de voorbeelden! Anders zou ik het niet vragen.

Ik heb nu:
code:
1
2
3
4
5
6
7
8
9
10
var result = from m in db.Monitors
   join s in db.Servers on m.ServerId equals s.ServerId
  group m by new {
  ServerName = s.ServerName,
  Datum = m.Datum
} into g
select new {
  ServerName = g.Key.ServerName,
  Datum = g.Max(p => p.Datum)
};

De max zit op de verkeerde plek?
EfBe heeft volgens mij al het juiste antwoord gegeven, maar als ik naar je SQL query kijkt die je om wilt zetten dan Group je alleen op ServerName, waarom doe je het dan in je LINQ query op zowel ServerName als Datum? Als je er beide op groepeert dan is er natuurlijk geen Maximum ( Of eigenlijk is het enige item in de group het maximum )
EfBe schreef op dinsdag 14 juli 2009 @ 13:30:
[...]
g.Group ? Lijkt me oude pre-RTM syntax. 'g' is de IEnumerable<IGrouping<TKey, TItem>>, niet een property van g.
offtopic:
Waar komt de Key property dan vandaan? Dat is geen Member van IEnumerable<T>? Of kijk ik nu verkeerd in de MSDN?

[ Voor 16% gewijzigd door Woy op 14-07-2009 13:40 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
EfBe schreef op dinsdag 14 juli 2009 @ 13:30:
Ik denk dat deze beter werkt:
code:
1
2
3
var q = from m in db.Monitors
        group m by m.Server.ServerName into g
        select new { ServerName = g.Key, Datum = g.Max(m=>m.Datum)};

Maar niet getest, dus wellicht fout.
Het werkt, bedankt!
De group m by m.Server.ServerName regel wist ik niet. Ik had niet door dat je daarmee een soort join legt met een andere tabel. En de max functie had ik ook niet door.

g.Group.Max werkte idd niet, lijkt een oude syntax idd. Had wel GroupBy en nog een tot m'n beschikking.
In ieder geval vriendelijk bedankt voor de moeite!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
EfBe schreef op dinsdag 14 juli 2009 @ 13:30:
Wellicht is het geven van een goed antwoord ook een idee ipv nutteloze info te geven waar TS niets mee kan?
Dat is wat lastig als TS (in eerste instantie) niet met een query/foutmelding komt waar we wat mee kunnen. Ik heb zelf weinig ervaring met Linq en de door mij gegeven links/voorbeelden waren gewoon wat ik zo snel kon vinden. En dan vraag ik me, logischerwijs, gewoon af waarom ik dat zo snel kan vinden en als dat niet werkt waarom dat dan zo zou zijn.
Of het pre-RTM syntax is geweest weet ik niet; dat kan goed zijn.

[ Voor 6% gewijzigd door RobIII op 14-07-2009 14:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • JvdS
  • Registratie: December 2003
  • Laatst online: 10-09 14:33
RobIII schreef op dinsdag 14 juli 2009 @ 14:02:
[...]
Dat is wat lastig als TS (in eerste instantie) niet met een query/foutmelding komt waar we wat mee kunnen. Ik heb zelf weinig ervaring met Linq en de door mij gegeven links/voorbeelden waren gewoon wat ik zo snel kon vinden. En dan vraag ik me, logischerwijs, gewoon af waarom ik dat zo snel kan vinden en als dat niet werkt waarom dat dan zo zou zijn.
Of het pre-RTM syntax is geweest weet ik niet; dat kan goed zijn.
Als ik het zo terug lees vind ik het een beetje kortzichtig van jou dat je wat google resultaten terugspuugt over een group by met een join. Mijn vraag was namelijk: Hoe voeg ik de Group By toe en de Max(M.Datum) zodat ik dezelfde SQL query krijg in linq? Als je dan zo weinig over LINQ weet, is het terugspugen van wat voorbeelden over basis LINQ queries voldoende?
Bovendien heb ik in de eerste post laten zien wat ik tot nu toe "aangerommeld" had.

Waar ik wel met je eens ben, is het feit dat ik de foutmelding had moeten geven, maar die heb ik daarna toch gepost?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
JvdS schreef op dinsdag 14 juli 2009 @ 14:15:
Als ik het zo terug lees vind ik het een beetje kortzichtig van jou dat je wat google resultaten terugspuugt over een group by met een join. Mijn vraag was namelijk: Hoe voeg ik de Group By toe en de Max(M.Datum) zodat ik dezelfde SQL query krijg in linq?
Ja, maar die Group en Max zag ik niet in je LINQ query ;)
JvdS schreef op dinsdag 14 juli 2009 @ 14:15:
Als je dan zo weinig over LINQ weet, is het terugspugen van wat voorbeelden over basis LINQ queries voldoende?
Ja, want die Group en Max zag ik niet in je LINQ query ;)
JvdS schreef op dinsdag 14 juli 2009 @ 14:15:
Waar ik wel met je eens ben, is het feit dat ik de foutmelding had moeten geven, maar die heb ik daarna toch gepost?
Daarna heb je mij ook niet meer gehoord ;)

[ Voor 14% gewijzigd door RobIII op 14-07-2009 14:22 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • koenie
  • Registratie: Januari 2000
  • Laatst online: 06:30
Heren,

Voor het geval jullie in de toekomst ooit nog eens een dergelijk probleem hebben met het vertalen van een SQL query naar LINQ dan kan ik je het programmma LINQER (http://www.sqltolinq.com/) aanbevelen.
De code die dit programma oplevert is lang niet altijd het geen je precies wilt hebben, maar het zet je wel in de goede richting.

Erg handig :)

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Woy schreef op dinsdag 14 juli 2009 @ 13:37:
[...]
offtopic:
Waar komt de Key property dan vandaan? Dat is geen Member van IEnumerable<T>? Of kijk ik nu verkeerd in de MSDN?
Nee, mijn fout, het is een IGrouping<TKey, TItem>, welke IEnumerable<TItem> implementeert, en die Key komt van de IGrouping... :)

[ Voor 4% gewijzigd door EfBe op 14-07-2009 14:57 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan had ik het toch goed gezien ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1