2013-01-16 16 views
5

Następująca funkcja działa dobrze, ale chciałbym go najpierw sortować wyniki przez parent_id, a następnie według porządku.Sortowanie Slick kwerendy wyniki dla wyrażenia

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) 

Jak to zrobić za pomocą Slick?

Odpowiedz

10

Podobnie jak w przypadku zwykłej kolekcji?

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

Jak intuicyjna składnia krotka jest ... Nie. Zły stary orderBy (nameThatHasMeaning, otherMeaningfulName.desc) został wycofany na korzyść składni sortBy (x => x._3 ~ x._4). Zręczny autor miał ku temu powody, ale końcowi użytkownicy cierpią na bojler i bezsensowne odliczanie, która liczba krotek w rezultacie. – virtualeyes

+0

Można "wydać" pewną instancję klasy case i 'getTree.sortBy (r => r.parent_id ~ r.order)', ale rzeczywista deklaracja klasy case jest szablonem. Może nazywał się 'Tuple'-s, z konstruktorem takim jak' ('nazwa1 -> wartość1,' nazwa2 -> wartość2) 'i accessor jak' apply (name: Symbol) 'będzie przydatny w rdzeniu Scala? Na przykład: 'yield (a.id, a.label, 'parent_id -> a.parent_id,' order -> a.order, c.id.?, A = c.name)', następnie 'getTree.sortBy (r => r ('parent_id) ~ r (' order)) ' – idonnie

+0

Czy ta odpowiedź jest nadal ważna dla wersji 2.1? POMYSŁ nie znajduje operatora ~. Czy też brakuje mi jakiegoś magicznego polecenia importu? –

1

Z Slick 2.1, znalazłem to do pracy:

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

(zweryfikowane przez wywołanie selectStatement na moje pytanie)