如何使用“ in” in&quot tuple在多个字段上过滤多个字段组合器(< - 。)
文档在一个字段中说明了“组合器”(< - 。
)中的使用方式:
selectSPJ :: MonadIO m => ReaderT SqlBackend m [Entity User]
selectSPJ = selectList [UserAge <-. [40]] []
有没有一种方法可以与多个字段一起使用?喜欢:
selectUsers :: MonadIO m => ReaderT SqlBackend m [Entity User]
selectUsers = selectList [(UserName, UserAge) <-. [("SPJ", 40), ("John Doe", 30]] []
哪个将转化为:
select user.name, user.age from user
where (name, age) in (values ('SPJ', 40), ('John Doe', 30));
组合签名依赖于PersistField
:
(<-.) :: forall v typ. PersistField typ => EntityField v typ -> [typ] -> Filter v
但是我看不到偷偷摸摸的方法:
data EntityField record :: Type -> Type
我设法使用“和”(记录]
)和“或”(||。。
)组合器,
mkFilters namesAndAges = foldl' mkFilter [] namesAndAges
mkFilter filters (name, age) = [UserName ==. name, UserAge ==. age] ||. filters
但结果查询要慢得多:
select user.name, user.age from user
where (name = 'SPJ' and age = 40) or (name = 'John Doe' and age = 30);
Documentation explains how to use "in" combinator (<-.
) for one field:
selectSPJ :: MonadIO m => ReaderT SqlBackend m [Entity User]
selectSPJ = selectList [UserAge <-. [40]] []
Is there a way to use it with more than one field? Like:
selectUsers :: MonadIO m => ReaderT SqlBackend m [Entity User]
selectUsers = selectList [(UserName, UserAge) <-. [("SPJ", 40), ("John Doe", 30]] []
Which would translate to:
select user.name, user.age from user
where (name, age) in (values ('SPJ', 40), ('John Doe', 30));
Combinator' signature relies on PersistField
:
(<-.) :: forall v typ. PersistField typ => EntityField v typ -> [typ] -> Filter v
But I can't see a way to sneak in a tuple:
data EntityField record :: Type -> Type
I managed to do it with "and" ([Filter record]
) and "or" (||.
) combinators
mkFilters namesAndAges = foldl' mkFilter [] namesAndAges
mkFilter filters (name, age) = [UserName ==. name, UserAge ==. age] ||. filters
But the resulting query is much slower:
select user.name, user.age from user
where (name = 'SPJ' and age = 40) or (name = 'John Doe' and age = 30);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论