2013-01-16 10 views
5

Die folgende Funktion funktionieren gut, aber ich mag es die Ergebnisse zuerst von parent_id sortieren und dann nach Bestellung.Sortierung Slick Abfrage-Ergebnisse in einem für den Ausdruck

def getTree = for { 
    (a, c) <- Activities leftJoin Clients on (_.id === _.id_a) 
} yield (a.id, a.label, a.parent_id, a.order, c.id.?, a=c.name) 

Wie mache ich das mit Slick?

Antwort

10

Wie bei gewöhnlicher Sammlung?

getTree.sortBy(r => r._3 ~ r._4) 
+1

Wie intuitiv das Tupel Syntax ist ... nicht. Schade alt orderBy (nameThatHasMeaning, otherMeaningfulName.desc) wurde zugunsten von sortBy (x => x._3 ~ x._4) Syntax veraltet. Der Slick-Autor hatte einen Grund dafür, aber die Endanwender leiden darunter, dass die Anzahl der Tupel als Ergebnis gezählt wird. – virtualeyes

+0

Sie könnten 'einige Fallklasseninstanz yield' und' getTree.sortBy (r => r.parent_id ~ r.order) ', aber tatsächliche Erklärung von Fall-Klasse ist ein Textvorschlag. Vielleicht namens 'Tuple'-s, mit Konstruktor wie' ('name1 -> value1,' name2 -> value2) 'und Accessor wie' apply (name: Symbol) 'wird in core Scala nützlich sein? Zum Beispiel: 'Ausbeute (.? A.id, a.label, 'parent_id -> a.parent_id,' bestellen -> a.order, c.id, a = c.name)', dann 'getTree.sortBy (r => r ('parent_id) ~ r (' order)) ' – idonnie

+0

Ist diese Antwort immer noch gültig für Slick 2.1? IDEA findet den Operator ~ nicht. Oder fehlt mir eine magische Importaussage? –

1

Mit Slick 2.1, fand ich dies funktioniert:

myQuery.sortBy(r => (r._3, r._4)) 

(durch den Aufruf selectStatement auf meine Anfrage überprüft)