F# 查询表达式:无法使用“for”!

3

出于某种原因,我无法在查询表达式中使用“for”结构。我得到的错误如下所示。我选择的代码过去能够工作 - > "error:仅当计算表达式生成器定义了“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

很奇怪,这出现在一个脚本中而不是另一个脚本中。 - Sasha Babaei
1个回答

8

我无法使用你提供的代码片段进行测试(没有数据库可用来测试),但我认为你所报告的错误类型可能是在 query 表达式之前在代码片段中定义了一个名为 query 的变量。例如:

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

错误 FS0708:只有当计算表达式构建器定义 'For' 方法时,才能使用此控制结构

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


1
谢谢Tomas,感谢您的辛勤工作推广这门语言并回答问题等。是的,那就是问题所在。顺便问一下,是否有这样的工具正在开发中,可以将SQL查询转换为F#查询表达式? - Sasha Babaei
我很高兴能够帮忙 - 我认为没有 SQL -> F# 查询工具 - 可能没有太高的需求。 - Tomas Petricek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接