首页 > 解决方案 > Slick 按列和值列表动态过滤

问题描述

我正在尝试使用动态过滤在 slick 中创建一个查询。我有一个Seq[(String, String)]元组的第一个元素是列名,而第二个元素是生成过滤器的值。

在伪代码中,我想做这样的事情:

val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable) {
    case(query, (column, value)) => query.filter(select(column) === value)
}

我已经有一个函数def select(name: String): Rep[_],它从它的名称开始返回列Rep,效果很好,但我不知道如何获得使===函数(或其他比较函数)工作所需的所有隐式。

有什么办法可以在 slick 中进行这样的动态过滤吗?

标签: scalaslick

解决方案


就在这里 !

我用这个方法

private def applyOperator[T](left: Rep[T], right: Rep[T], operator: String)(implicit om: OptionMapper2[T, T, Boolean, T, T, Boolean]): Rep[Boolean] = {
    operator match {
      case "==" => new BaseColumnExtensionMethods(left) === right
      case "!=" => new BaseColumnExtensionMethods(left) =!= right
      case "like" => new StringColumnExtensionMethods(left.asInstanceOf[Rep[String]]) like right.asInstanceOf[Rep[String]] //Breaks if T is not String
    }
  }

然后你可以写类似

val filters: Seq[(String, String)]
val query = filters.foldLeft(entityTable) {
    case(query, (column, value)) => query.filter(applyOperator(yourFunctionForColumnFromName(column),value, "=="))
}

推荐阅读