1

我有一个案例类员工

 case class Employee(id: Int, 
                     name: String, 
                     age: Int, is_permanent: Boolean, 
                     company_name: String)

我正在使用 Quill SQL 过滤这个 Employee 案例类,如下所示:

quote {
  query[Employee]
    .filter(e => e.age > 100)
    .filter(e => liftQuery(List("Robin, Peter")).contains(e.name))
}

它编译得很好。

现在我想把第二个filter放到一个函数中并重用它。喜欢

  val employeeQueryFunc: (Employee => Boolean) = e => {
    liftQuery(List("Robin, Peter")).contains(e.name)
  }

然后在我需要的多个位置应用此功能。如果我像这样把它放到员工查询中

 quote {
  query[Employee]
    .filter(e => e.age > 100)
    .filter(employeeQueryFunc)
}

它不编译。我得到错误

  this.Employee]).filter(((e: FindAllIssuesRepoQuery.this.Employee) => e.age.> . 
  (100))).filter(employeeQueryFunc)' can't be parsed to 'Ast'

理想情况下,它应该编译为过滤器块还包含一个返回布尔值并employeeQueryFunc返回布尔值的函数。有谁知道它可以作为一个函数重用吗?

4

2 回答 2

1

有一个类似的问题 - 已经尝试过丹尼尔的建议,就我而言,重写就足够了

quote {
  query[Employee]
    .filter(e => e.age > 100)
    .filter(employeeQueryFunc)
}

进入:

quote {
  query[Employee]
    .filter(e => e.age > 100)
    .filter(e => employeeQueryFunc(e))
}

(不知道为什么)

于 2021-06-17T12:32:12.463 回答
0

在尝试将通用逻辑提取到私有方法时,我遇到了类似的问题。将employeeQueryFunc 更新为:

private def employeeQueryFunc = quote {
    (e: Employee) => liftQuery(List("Robin, Peter")).contains(e.Name)
}

并通过以下方式调用此方法:

quote {
  query[Employee]
    .filter(e => e.age > 100)
    .filter(e => employeeQueryFunc(e))
}
于 2020-12-14T13:51:15.967 回答