如何使用“ in” in&quot tuple在多个字段上过滤多个字段组合器(< - 。)

发布于 2025-02-06 02:13:30 字数 1413 浏览 0 评论 0原文

文档在一个字段中说明了“组合器”(< - 。)中的使用方式:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文