2015-08-07 4 views
2

Я пытаюсь отфильтровать таблицу с параметрами, которые могут быть необязательными. С slick 2.1 это сработало, но когда я перехожу к версии 3.0, больше не работает, ошибка: «не удается разрешить символ & &», когда я вызываю функцию «уменьшить».Динамические условия запроса Slick 3.0

Я был бы признателен за любую помощь .. спасибо

Это код:

def getAll(params : ClienteSearchParameters) : DBIOAction[Iterable[Cliente], NoStream, Effect.Read] = { 

     val q = for { 
     (x, (y, z)) <- tabla join (tablaPersonas joinLeft tablaContactos on (_.id === _.idPersona)) on (_.idPersona === _._1.id) 
      if { 
      List(
       params.nombre.map(y.nombre === _), 
       params.apellido.map(y.apellido === _), 
       params.fechaAlta.map(x.fechaAlta === _), 
       params.fechaRegistracion.map(x.fechaRegistracion === _) 
      ).flatten match { 
       case Nil => LiteralColumn[Boolean](true) 
       case seq => seq.reduce(_ && _) 
      } 
      } 
     } yield (x, y, z) 

ответ

0

Вот информация от дока http://slick.typesafe.com/doc/3.0.0/queries.html#sorting-and-filtering

Я думаю, вы можете найти здесь то, что вы хотите , Пример из дока:

//building criteria using a "dynamic filter" e.g. from a webform. 
val criteriaColombian = Option("Colombian") 
val criteriaEspresso = Option("Espresso") 
val criteriaRoast:Option[String] = None 

val q4 = coffees.filter { coffee => 
    List(
     criteriaColombian.map(coffee.name === _), 
     criteriaEspresso.map(coffee.name === _), 
     criteriaRoast.map(coffee.name === _) // not a condition as `criteriaRoast` evaluates to `None` 
).collect({case Some(criteria) => criteria}).reduceLeftOption(_ || _).getOrElse(true:Column[Boolean]) 
} 
+0

я попробовать .. но я получаю ошибку ... «не может разрешить символ &&» ... –

+0

Я нашел ошибку, оба решения работают, проблема в том, что оба «y.apellido» и «x.fechaAlta» являются опциями colums, тогда символ && не найден. Если я использую метод «getOrElse», он работает хорошо, но не уверен, что это лучший способ. –

+0

Вы можете попробовать что-то вроде этого: params.apellido.flatMap (v => y.apellido.map (v === y)), –

Смежные вопросы