我正在尝试使用动态过滤的方式创建一个查询。我有一个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
所需的所有隐式变量功能(或其他比较功能)起作用。
有什么方法可以进行平滑的动态过滤吗?
答案 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, "=="))
}