gpt4 book ai didi

Scala Slick - 将 TableQuery[E] 转换为 Query[E] 以链式操作

转载 作者:行者123 更新时间:2023-12-05 01:15:27 25 4
gpt4 key购买 nike

我正在尝试通过使用操作列表并折叠列表来将一系列可选的过滤操作应用于查询。

val table = TableQuery[Fizz]
val filters = List(filter1(option1)_, filter2(option2)_, filter3(option3)_)
val filteredQuery = filters.foldLeft(table){(q, filter) => filter(q)}

部分应用的过滤函数的签名为

Query[Fizz, FizzRow, Seq] => Query[Fizz, FizzRow, Seq]

基本上,在每个函数中,如果存在过滤参数选项*,我可以选择应用过滤。但是,编译器不喜欢我将 TableQuery 传递给采用 Query 的函数,即使 TableQuery 是 Query 的子类型。有没有办法将 TableQuery 转换为 Query?或者更好的方法来在查询上链接过滤器函数?

有问题的编译器错误是

类型不匹配;

发现:scala.slick.lifted.Query[generated.Tables.Farm,generated.Tables.FarmRow,Seq]

需要:scala.slick.lifted.TableQuery[generated.Tables.Farm]

我可以使用 table.drop(0) 而不是 table 来编译它,但显然这似乎是一个糟糕的解决方法。我看到 TableQuery 上有一个 to 方法可以将其转换为查询,但它也采用隐式 ctc:TypedCollectionTypeConstructor[D]。

上面列出的 filterX 函数之一的示例:

def filterCharacteristics(characteristics: Option[List[Int]])(table: Query[Farm,FarmRow,Seq]) = {
characteristics.map(chars =>
(for {
(fc, f) <- Farmcharacteristic.filter(_.characteristicId inSet chars) join table on (_.farmId === _.farmId)
} yield f)).getOrElse(table)
}

最佳答案

我想你可以尝试另一种方法。您可以使用 collect 来仅获取 Some 值,而不是使用 fold。然后您可以对每个选项应用过滤器:

val table = TableQuery[Fizz]
val filteredQueries = List(Some(option1), Some(option2), Some(option3)) collect {
case Some(option) => option
} map { currentOption =>
table.filter(currentOption)
}

// We need to get the last value or the TableQuery
val lastValue = filteredQueries reverse headOption

// Or we have Some(Query) or None, In case it is a None, we will use table
lastValue.getOrElse(table)

关于Scala Slick - 将 TableQuery[E] 转换为 Query[E] 以链式操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com