平滑地按列和值列表动态过滤

时间:2018-11-09 10:43:27

标签: scala slick

我正在尝试使用动态过滤的方式创建一个查询。我有一个export class Model { _id: ID constructor(arg: ID | string | Object) { if (typeof arg === 'object') this.loadObject(arg) } loadObject(obj: Object) { Object.assign(this, obj) } } export class User extends Model { _id: ID username: string constructor(arg) { super(arg) } } ,其中元组的第一个元素是列名,而第二个是构成过滤器的值。

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

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所需的所有隐式变量功能(或其他比较功能)起作用。

有什么方法可以进行平滑的动态过滤吗?

1 个答案:

答案 0 :(得分:1)

是的!

我使用这种方法

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, "=="))
}