进行从可选ID过滤的Slick查询?

时间:2018-12-06 01:03:56

标签: scala slick

我想通过id查询对象,但是如果还提供了fooId,那么我想将其包括在查询中。

def getById(id: Long, fooIdOpt: Option[Long]): Future[Option[Bar]] = {
  val query = for {
    b <- bars if b.id === id && fooIdOpt.fold(true)(b.fooId === _)
  } yield {            // Compiler error here ^
    b
  }
  db.run(query.result.headOption)
}

这里的问题是fooIdOpt.fold(true)(b.fooId === _)需要返回一个Rep[Boolean],但是我正在使用Boolean初始化折叠-明显违反了fold的类型方法签名。

但是,我似乎找不到一种方法将传递为Rep[Boolean]的{​​{1}}作为折叠初始值设定项。在黑暗中拍摄时,我尝试过trueRep(true),但都没有用。

我可以完全放弃LiftedLiteral[Boolean](true)并选择:

fold

但这似乎太复杂了,b <- bars if { val rep1 = b.id === id fooIdOpt.map(fooId => rep1 && b.fooId === fooId).getOrElse(rep1) } 看起来不会更好。

  1. 有没有办法实例化始终为fooIdOpt match { case Some ...的{​​{1}}文字?
  2. 如果没有,那么除了上面的Rep[Boolean]truefold之外,还有其他选择可以使我建立一个查询,该查询可以选择比较map价值?

2 个答案:

答案 0 :(得分:2)

您已经知道,ifEmpty的{​​{1}}值类型必须与fold的{​​{1}}类型相匹配。一种方法是将b.fooId === _应用于Rep[Boolean]值,如下所示:

bind

答案 1 :(得分:1)

一种不像其他选择那么糟糕的替代选择:

(fooIdOpt.toList.map(b.fooId === _) :+ (b.id === id)).reduceLeft(_ && _)