根据我目前看到的代码示例,鉴于rowParser
type RowParser[Photo]
,这就是你如何解析来自 table 的行列表:photo
def getPhotos(album: Album): List[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
).as(rowParser *)
}
运算符在其中*
创建类型为 的解析器ResultSetParser[List[Photo]]
。现在,我想知道是否同样有可能获得一个产生 a 的解析器Stream
(认为更懒惰总是更好),但我只是想出了这个:
def getPhotos(album: Album): Stream[Photo] = DB.withConnection { implicit c =>
SQL("select * from photo where album = {album}").on(
'album -> album.id
)() collect (rowParser(_) match { case Success(photo) => photo })
}
它有效,但似乎过于复杂。我当然可以调用我从第一个函数中得到的,但我的目标是只应用于toStream
实际读取的行。有没有更简单的方法来实现这一点?List
rowParser
编辑:如果事先知道感兴趣的行数,我知道limit
应该在查询中使用它。我也知道,在很多情况下,无论如何你都会使用整个结果,所以懒惰不会提高性能。但是在某些情况下,您可能会节省几个周期,例如,如果由于某种原因,您有无法或不想在 SQL 中表达的搜索条件。所以我觉得奇怪的是,鉴于 anorm 提供了一种获得 a Stream
of 的方法SqlRow
,我没有找到一种直接的方法来应用 a RowParser
。