我有几天无法解决的问题,
我想根据我的可选值进行动态查询。如果定义了一个值,我想查询选定的结果,否则给我*表的投影。
由于无法理解地将Lift Embedding DSL与普通的Scala代码混合使用,是否有其他方法可以实现?
val x: Option[String] = Some("John")
看起来或做某事的事情
val result = for {
w <- workers if (x.isDefined) w.name === x else * projection
}
另外,是否有可能编写具有可选参数并将其链接在将在WHERE子句OR条件中生成的查询中的函数?对于动态数量的OPTIONAL参数,我设法使用MaybeFilter做到了这一点,但仅针对AND条件。
case class MaybeFilter[X, Y](val query: scala.slick.lifted.Query[X, Y, Seq]) {
def filteredBy(op: Option[_])(f: (X) => Column[Option[Boolean]]) = {
op map { o => MaybeFilter(query.filter(f)) } getOrElse { this }
}
}
implicit def maybeFilterConversor[X, Y](q: Query[X, Y, Seq]) = new MaybeFilter(q)
val x: Option[String] = Some("Ana")
val y: Option[String] = Some("Lemic")
val result = for { r <- radnik.filteredBy(x)(_.ime === x).filteredBy(y)(_.prz === y).query } yield r
prints out select x2.`Mbr`, x2.`Ime`, x2.`Prz`, x2.`Sef`, x2.`Plt`, x2.`Pre`, x2.`God` from `radnik` x2 where (x2.`Ime` = 'Ana') and (x2.`Prz` = 'Lemic')
我需要一个函数,该函数将链接任意数量的可选条件,如filteredBy,但会产生一个与之绑定的OR过滤器,以实现类似
select x2.`Mbr`, x2.`Ime`, x2.`Prz`, x2.`Sef`, x2.`Plt`, x2.`Pre`, x2.`God` from `radnik` x2 where (x2.`Ime` = 'Ana') or (x2.`Prz` = Lemic') or (x2.`God` >= '1950')
就像filteredBy(某物)。或FilteredBy(某物).filteredBy(某物)
提前致谢。
最佳答案
如官方documentation所示,您可以建立动态过滤条件,如下所示:
val x: Option[String] = Some("Ana")
val y: Option[String] = Some("Lemic")
val result = radnik.filter { r =>
List(
x.map(radnik.ime === _),
y.map(radnik.prz === _)
).collect({case Some(criteria) => criteria}).reduceLeftOption(_ || _).getOrElse(true: Rep[Boolean])
}