2017-10-08 9 views
3

어떤 이유로 든 쿼리 식 내에서 "for"구문을 사용할 수 없습니다. 내가 얻는 것은 다음과 같은 오류입니다. 코드 I I 작동하는 데 사용 집어 그냥 뭐 -> "오류 : 연산 식 작성기는 메소드 '의 경우'정의하는 경우이 컨트롤 구조에만 사용 할 수있다"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 { .. }의 식별자 queryquery.For 등 다양한 회원을 보유 표준 F 번호 라이브러리에 선언 단지 변수가 있다는 것이다. 자신의 선언으로 이것을 숨기면 멤버를 찾을 수 없습니다.

+0

Tomas, 언어 학습 및 질문에 대한 답변 등 모든 노력에 감사드립니다. 예, 문제였습니다. BTW, SQL 쿼리를 F # 쿼리 식으로 변환하는 도구가 있습니까? –

+0

내가 도와 드릴 수있어서 기쁩니다. SQL -> F # 쿼리 도구가 있다고 생각하지 않습니다. 아마도 그럴 필요가 없을 것입니다. –