| .NET LINQ - OrderBy ThenBy | ||
|---|---|---|
|
Spartacus
23. jul 2014 14:32:38
Pridružen od: 23. dec 2007 642 objav 828 38 4 |
#1
Zdravo mojstri! Ciljam na tistih nekaj .NET programerjev, ker (spet :) ) rabim malenkost pomoči. Zgodba je ta, da imam objekt tipa DataTable, ki ga je treba posortirat glede na stolpce. Glavni trik je pa v tem, da pri pogoju ni vedno isto število stolpcev (lahko je en, lahko jih je pa n). Vprašanje je torej: ali ima kdo izkušnje, kako dinamično sestavit LINQ sortiranje? Med brskanjem po netu sem naletel na tole rešitev, konkretno moja implementacija pa izgleda takole: . Še malenkost razlage: sbOrder je tak, kot je pri SQL sintaksa za ORDER BY - torej, v stilu "NAZIV ASC, CENA DESC". Ta string se potem razbije na tabelo posameznih polj (querySegments), ki za dan primer izgleda: "NAZIV ASC", "CENA DESC". Potem se pa vsak segment razbije še na subSegment polje, kjer je prvi element ime stolpca (npr. "NAZIV"), drugi element je pa smer ("ASC" oz. "DESC"). Če drugega elementa ni, se predpostavi "ASC". Problem pri tej implementaciji je, da je rezultat sortiran samo po zadnjem pogoju - čeprav ne bi smel biti, ker naj bi ThenBy oz. ThenByDescending upoštevala predhodne pogoje. Našel sem tudi DynamicQuery knjižnico, ki vsaj glede na dokumentacijo rešuje ta problem. Ampak preden se spravim kopat v tisto smer, bi najprej rad preveril, če pri trenutni implementaciji delam kakšne neumnosti. Vsak (s temo povezan) komentar izredno dobrodošel. And as always: tole ni tema za komentarje "V javi/phpju/rubyju/brainfucku je pa to čist simple narest. M$ sucks.". |
|
|
wingback
24. jul 2014 09:05:40
Pridružen od: 19. maj 2013 334 objav 224 14 3 |
#2
Čisto tko na uč. Nevem če se v teh poznejšem ordering tale .ThanByDescending zaveda da je predhodno bil že klican .OrderByDescending(...). Daj probaj narest query orderedResults.OrderByDescending(..).ThanByDescending(..) v enem šusu pa preveri kak je rezultat. |
|
|
Spartacus
24. jul 2014 09:38:33
Pridružen od: 23. dec 2007 642 objav 828 38 4 |
#3
Tole sem že poskusil: če je vse v enem šusu, potem je sortiranje ok. Teoretično, bi se moral ThenBy zavedat, da je bil OrderBy že klican. Ker najprej se naredi tole: . Potem pa se nad tem rezultatom kliče ThenBy . Recimo, jst lahko naredim tole: . Ampak kot rečeno, niso vedno ista polja po katerih je treba sortirat. Tudi številčno je lahko eno polje za sortiranje, ali pa jih je več. Tako, da iščem rešitev za dinamično sortiranje oz. kako dinamično sestavit vse skupaj. Je mogoče kakšen alternativen način, kako bi se to dalo rešit? |
|
|
FrEaKmAn
27. jul 2014 20:35:12
Pridružen od: 2. dec 2007 303 objav 175 59 0 |
||
|
Spartacus
28. jul 2014 11:22:46
Pridružen od: 23. dec 2007 642 objav 828 38 4 |
#5
Hvala obema za odgovore. Izkazalo pa se je, da je problem veliko bolj enostaven in da je šlo za čisto šlamparijo z moje strani :) Test, ki ga je predlagal wingback, sem izvedel na precej premajhnem vzorcu, zato nisem uspel opazit napake. Problem je bil v tem, da tale moja extension metoda GetItem vedno vrne string (tudi, če gre za numerično vrednost). Torej so vrednosti "1", "4", "10", "30" po sortiranju v tem zaporedju: "1", "10", "30", "4". Kar je sicer smiselno, meni pa nerodno priznat :) Tako, da je bilo treba dodat preverjanje tipa vrednosti (in ustrezna pretvorba), potem pa laufa ko šus :) "Chainanje" .ThenBy dela brez problema. Live and learn :) |
|