Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Linq Orderby lijst van een lijst

Pagina: 1
Acties:

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
Beste Tweaker,

Ik probeer zojuist met Linq te positioneren op volgorde van positie. Nu is het zo dat mijn structuur iets veranderd is aangezien het object een meer op meer relatie is. Vandaar dat ik een lijst met posities bijhoud.

code:
1
var contentpageAbove = this.context.ContentPages.OrderByDescending(m => m.Positions.Position).FirstOrDefault(m => m.Position < contentpage.Position && m.Menus.Any(a => a.Id == menuId));


Het stukje
C#:
1
m.Positions.Position


kan hij niet vinden omdat m.Positions een lijst is en Position is een property

Ik heb geprobeerd een orderby in het stukje "m => m.Positions.Position" te plaatsen. Maar dat vond c# niet zo leuk. Ik denk dat ik te moeilijk denk en er moet een gemakkelijkere methode zijn om dit voor elkaar te krijgen.

Heeft er iemand een idee?

Met vriendelijke groet,

Kevin.

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Uhm, als er meerdere mogelijk posities zijn, hoe bepaal je dan je sorteervolgorde? Gewoon de eerste (m.Positions.First().Position) of, een willekeurige of, de kleinste of, de grootste of, etc.

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
Een contentpagina kan in meerdere menu's voorkomen. Vandaar dat ik een lijst maak. Maar een contentpagina kan maar 1 keer per menu voorkomen. Dus als je een vergelijking doet met een menu kan hij altijd maar 1 resultaat teruggeven.

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 21-11 19:52
Je begrijpt HMS verkeerd: Je moet een beslissing maken over hoe we van m.Positions naar 1 element daarvan gaan met de element.Position waarde die je wilt hebben. Wil je de laagste mogelijke Position waarde hebben, de Position waarde van het element die voldoet aan een andere voorwaarde of iets anders? Op basis daarvan kun je de juiste query uitkiezen om m.Positions te transformeren in een enkele waarde waarmee ContentPages kan worden gesorteerd.

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
Ah zo bedoel je, ik wil 1 positie (dus lager) hebben van de contentpage die ik wil verplaatsen.

Dus stel de positie van de huidige contentpage is 13 dan moet de positie 12 zijn. Namelijk omdat positie 12 eerder komt dan 13.

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 21-11 19:52
ContentPages is een lijst, die bewerk je nu ook al om 1 bepaalde element te vinden. Hetzelfde kun je doen bij m.Positions om een bepaalde element te vinden die voldoet aan je voorwaarde voor m.Positions. Zodanig sorteren dat de meest gewenste element dat voldoet aan je voorwaarde als eerste zal komen en alle elementen die niet voldoen wegstrepen.

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
De vraag is alleen hoe kan ik de bovenliggende (lagere positie) ophalen? ik moet ik firstordefault gebruiken zeg je volgens mij. Maar hoe krijg ik de de onderliggende positie te pakken? Zonder een hack als +1 en -1 te gebruiken uiteraard :P

  • CM5
  • Registratie: Maart 2003
  • Niet online

CM5

Ik begrijp de context niet helemaal, maar doet dit wat je wil:

code:
1
var contentpageAbove = this.context.ContentPages.Where(= => m.Menus.Any(a => a.Id == menuId))).SelectMany(m => m.Positions.Position).OrderByDescending().FirstOrDefault(p => p < contentpage.Position) ;


Ik kan het helaas niet testen voor je ;)

  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
Sorry voor mijn late reactie. Ik was het een en het ander aan het testen. Ik moest de code van CM5 iets veranderen. Maar het is gelukt! Ik wist niet dat je dit kon oplossen met SelectAny bedankt!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Kan je niet de boel afknippen en dan de eerste nemen van de lijst die overblijft?

Ik zag ook nog dit voorbeeld op SO:

code:
1
2
3
4
5
6
var e = Enumerable.Range(0,100);
var itemIKnow = 50;
var linkedList = new LinkedList<int>(e);
var listNode = linkedList.Find(itemIKnow);
var next = listNode.Next.Value; //probably a good idea to check for null
var prev = listNode.Previous.Value; //ditto

[ Voor 66% gewijzigd door raptorix op 06-08-2014 13:26 ]


  • kevinkrs
  • Registratie: Juni 2010
  • Laatst online: 21-11 11:52
raptorix schreef op woensdag 06 augustus 2014 @ 13:19:
Kan je niet de boel afknippen en dan de eerste nemen van de lijst die overblijft?

Ik zag ook nog dit voorbeeld op SO:

code:
1
2
3
4
5
6
var e = Enumerable.Range(0,100);
var itemIKnow = 50;
var linkedList = new LinkedList<int>(e);
var listNode = linkedList.Find(itemIKnow);
var next = listNode.Next.Value; //probably a good idea to check for null
var prev = listNode.Previous.Value; //ditto
Probleem dan is dat je erg veel code kwijt ben en van lijst naar lijst werkt. Terwijl je nu 1 lijst hebt in 1 query waardoor het totaalresultaat een stuk overzichtelijker is.
Pagina: 1