[Linq] linq op een many to many relatie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste mensen.
Ik breek nu al 3 dagen mijn hoofd over het volgende vraagstuk:

Ik heb 3 tabellen:

Artikel (ArtikelID, Omschrijving)
Categorie (CategorieID, Omschrijving)
ArtikelCategorie (ArtikelID, CategorieID)

Een artikel kan dus meerdere categorieen hebben...

Nu heb ik een formulier gemaakt waarin mensen met een checkboxlist 1 of merdere categorieen aan kunnen vinken. De bijbehorende artikelen moeten dan worden getoond.

Ik stop de categorieen die zijn aangeklikt in een List<Categorie> (Ik programmeer in c#)

De artikelen van 1 categorie ophalen is niet zo moeilijk:

List<Artikel> artikelen = Artikelen.Where(a => a.ArtikelCategorieen.Any(ac => ac.CategorieID == gewensteCategorieID)).ToList();

Maar ik wil dus zonder foreach een linq query die de artikelen van meerdere categorieeen terug geeft. Heeft iemand een idee?

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Simpel,plaats alle id's van de aangevinkte checkboxen in een collection en gebruik vervolgens collection.Contains(ac.CategoryID) in je linq query..

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


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Iets als dit ? Is dit enitity framework, linq to sql, of iets anders? Wil je artikelen die aan een categorie voldoen, of die aan alle categorieën voldoen? Die Any in je voorbeeldquery is een beetje gek denk ik. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Zonder het antwoord van Niemand_Anders te hebben gelezen, dacht ik ook gelijk aan 'Contains'.

Dat lijkt me dus de functie die je nodig hebt.

Trouwens een extra-tip: Hier staan veel voorbeelden van handige LINQ-queries: http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
voordat ik het antwoord van niemand anders had gelezen dacht ik zelf ook al aan contains, maar hij noemt in zijn voorbeeld maar 1 categorie!
En ik wil dus een collectie doorgeven.

De query die ik wel hebben is in SQL heel simpel, maar ik kom er maar niet achter hoe dit in linq moet.
Ik zal voor de duidelijkheid hieronder nog even de query tonen zoals hij in SQL er uit ziet:

tijdelijke tabel met categorieen (IDs) waaran ik de artikelen wil zien: tmpCategorieIDs

Select * FROM Artikel
WHERE ArtikeID IN (SELECT ArtikelID FROM ArtikelCategorie WHERE CategorieID IN (SELECT CategorieID FROM tmpCategorieIDs))

Dus bovensstaande query in linq! Wie weet raad???

Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

C#:
1
var artikelen = context.Artikelen.Where(a => a.ArtikelCategorieen.Any(ac => geselecteerdeCategorieen.Any(sc => ac.Categorie.ID == sc.ID));


Zoiets?

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
offtopic:
[snip achterhaalde/hier niet van toepassing zijnde kennis]

[ Voor 98% gewijzigd door pedorus op 09-04-2010 14:55 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 13-07 01:53

Korben

() => {};

Allereerst, mijn oplossing klopt niet, het moet zijn:

C#:
1
var artikelen = context.Artikelen.Where(a => a.ArtikelCategorieen.Any(ac => geselecteerdeCategorieen.Contains(sc.ID));
pedorus schreef op vrijdag 09 april 2010 @ 14:11:
[...]
Omdat joins bijna altijd beter zijn dan in, bijvoorbeeld qua performance.
[...]
Ten eerste, als je over performance gaat blaten zou ik eerst eens de 'SELECT *' uit je query halen, dat is ook niet echt goed voor je performance.

Ten tweede, dat maakt niet uit. Of je nou jouw 'join'-variant, de TS zijn 'in'-variant, of de query die LINQ uitspuugt met een EXISTS draait, de execution plans zijn hetzelfde.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Korben schreef op vrijdag 09 april 2010 @ 14:27:
Ten eerste, als je over performance gaat blaten zou ik eerst eens de 'SELECT *' uit je query halen, dat is ook niet echt goed voor je performance.
Alleen voor voorbeeld natuurlijk
Ten tweede, dat maakt niet uit. Of je nou jouw 'join'-variant, de TS zijn 'in'-variant, of de query die LINQ uitspuugt met een EXISTS draait, de execution plans zijn hetzelfde.
Je hebt gelijk, als ik het uittest komt de originele in-variant in sommige gevallen zelfs met een sneller resultaat. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Korben geweldig bedankt!
Ik heb het nu aan de praat met jouw query
Alleen sc.ID moest ac.ID zijn, maar het wertk dus nu...
Pagina: 1