linq 在查询中使用可选变量

m3eecexj  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个用于查询数据库的搜索类型,如下所示,

type UserSearch = 
  { limit: int option
    skip: int option }

我正在使用SQLProvider,并希望在查询中使用limitskip变量,例如

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

由于查询是惰性的,这应该会导致一个单一的查询,我的假设正确吗?

slmsl1lt

slmsl1lt1#

不幸的是,query构建器将结果转换为seq<_>,并强制它运行SQL查询,因此您无法轻松地以这种方式组合查询。您可能会使用更复杂的技巧,但对于您的特定情况,使用合理的默认值可能会更容易,例如0对应skipInt32.MaxValue对应take

query {
  for user in Db.getDataContext().MyDb.Users do
  skip (defaultArg searchParams.skip 0)
  take (defaultArg searchParams.limit.Value Int32.MaxValue)
  select user }

这将生成一个包含skiptake的查询,即使您并不需要它,这可能会对性能产生一些影响-我认为这并不重要,但最好对此进行测试。

相关问题