scala - 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 中进行这样的动态过滤吗?
解决方案
就在这里 !
我用这个方法
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, "=="))
}
推荐阅读
- javascript - 刷新用户所在的页面并重定向
- python - 在python中定义一个add函数
- javascript - 如何从 json 数组中删除名称值对对象?
- solace - 慰藉队列的到期时间
- firebird - 服务器端的 Firebird 计算(计算)字段
- python - AWS Beanstalk 中的 Django 应用程序部署 - 部署后出错 - 内部服务器错误
- python - 使用 Python 估算缺失的日期和值
- linux - 当文件不等于零时,将文件中的所有列与同一文件中的引用列进行比较
- c# - 我可以将 DateTimeOffset 对象配置为在 Azure Cosmos 的 ISO 8061 中呈现吗?
- java - 我在 Java 中对 Mongo 的正则表达式查询有问题