【问题标题】:F# Query Expressions: cannot use "for"!F# 查询表达式:不能使用“for”!
【发布时间】:2017-10-08 13:22:27
【问题描述】:

无论出于何种原因,我都不能在查询表达式中使用“for”构造。我得到的是以下错误。我刚刚选择的代码曾经可以工作--> "错误:只有在计算表达式构建器定义了一个 'For' 方法时,才可以使用这个控件构造"

#r "System.Data.Linq.dll"
#r "FSharp.Data.TypeProviders.dll"

open FSharp.Linq
open FSharp.Data.TypeProviders

[<Literal>]
let connectionString' = @"
    data source = ...;
    initial catalog = NORTHWND;
    Integrated Security = SSPI"

type NorthwndDb =
    SqlDataConnection<connectionString', Pluralize = true>

let db' = NorthwndDb.GetDataContext()

let curstomerSortedByCountry =
    query { for c in db'.Customers do
                sortBy c.Country
                select (c.Country, c.CompanyName) } 
    |> Seq.cache

【问题讨论】:

  • 奇怪的是,这发生在一个脚本中,而不是另一个。

标签: for-loop f# query-expressions


【解决方案1】:

我无法使用您的代码 sn-p 对此进行测试(没有用于测试的数据库),但我认为如果您定义了一个名为 query 的变量,就会发生您报告的错误类型在 query 表达式之前的代码 sn-p 中的某处。例如:

let query = "oops!"
let curstomerSortedByCountry =
    query { for c in [1 .. 10] do
            sortBy c
            select c } 

错误 FS0708:只有在计算表达式构建器定义了“For”方法时,才能使用此控制构造

原因是query { .. } 中的标识符query 只是标准F# 库中声明的一个变量,它具有包括query.For 在内的各种成员。如果您使用自己的声明隐藏它,则将找不到该成员。

【讨论】:

  • 感谢 Tomas,感谢您为此以及您为推广语言和回答问题等所做的所有辛勤工作。是的,这就是问题所在。顺便说一句,是否有这样的工具可以将 SQL 查询转换为 F# 查询表达式?
  • 我很高兴能提供帮助 - 我认为没有 SQL -> F# 查询工具 - 对此的需求可能不高。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
相关资源
最近更新 更多