我有一个用于查询数据库的搜索类型,如下所示,
type UserSearch =
{ limit: int option
skip: int option }
我正在使用SQLProvider
,并希望在查询中使用limit
和skip
变量,例如
query {
for user in Db.getDataContext().MyDb.Users do
select user
// if searchParams.limit.IsSome then
// take searchParams.limit.Value
// if searchParams.skip.IsSome then
// skip searchParams.skip.Value
}
有可能吗?
我目前的做法如下:
let mutable search =
query {
for user in Db.getDataContext().MyDb.Users do
select user
}
if searchParams.limit.IsSome then
search <-
query {
for user in search do
select user
take searchParams.limit.Value
}
search |> Seq.toArray
由于查询是惰性的,这应该会导致一个单一的查询,我的假设正确吗?
1条答案
按热度按时间slmsl1lt1#
不幸的是,
query
构建器将结果转换为seq<_>
,并强制它运行SQL查询,因此您无法轻松地以这种方式组合查询。您可能会使用更复杂的技巧,但对于您的特定情况,使用合理的默认值可能会更容易,例如0
对应skip
,Int32.MaxValue
对应take
:这将生成一个包含
skip
和take
的查询,即使您并不需要它,这可能会对性能产生一些影响-我认为这并不重要,但最好对此进行测试。