2017-10-08 40 views
3

無論出於何種原因,我無法在查詢表達式中使用「for」構造。我得到的是以下錯誤。該代碼我正是我拿起那個曾經工作 - > 「錯誤:如果計算表達式生成器定義在‘For’方法僅可用於這種控制結構」F#查詢表達式:不能使用「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 
+0

奇怪的是,這發生在一個腳本中,而不是在另一個腳本中。 –

回答

6

我沒能測試這與你的代碼片段(沒有數據庫來測試這個)相反,但我認爲如果你在query表達式之前的代碼片段中定義了一個名爲query的變量,就會發生你報告的錯誤。例如:

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

error FS0708: This control construct may only be used if the computation expression builder defines a 'For' method

這樣做的原因是,在query { .. }標識符query只是在具有各種部件,包括query.For標準F#庫聲明的變量。如果你用自己的聲明隱藏這個,那麼這個成員就不會被找到。

+0

謝謝Tomas,爲此以及爲推動語言和回答問題等所有努力工作。是的,那就是問題所在。順便說一句,是否有這樣一個工具,將SQL查詢翻譯成F#查詢表達式? –

+0

我很高興我可以幫助 - 我不認爲有一個SQL - > F#查詢工具 - 可能對此沒有太高的要求。 –