2016-04-26 13 views
5

Sto cercando di interrogare i dati con F # SqlDataProvider ma ho ottenuto strano errore quando mi piacerebbe utilizzare la funzione groupByF # groupBy - System.Exception: metodo non riconosciuta chiamata

il mio codice di inizializzazione:

r# "packages/FSharp.Data.2.2.5/lib/net40/FSharp.Data.dll" 
r# "packages/SQLProvider.1.0.0/lib/FSharp.Data.SQLProvider.dll" 
r# "packages/FSharp.Data.TypeProviders.5.0.0.2/lib/net40/FSharp.Data.TypeProviders.dll" 

open FSharp.Data 
open FSharp.Data.Sql 
open FSharp.Data.TypeProviders 
open FSharp.Linq 
open System.Text.RegularExpressions 
open System 
open System.Data 

type dbSchema = SqlDataProvider< 
        ConnectionString = "my-connection-string", 
        DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER, 
        IndividualsAmount = 1000, 
        UseOptionTypes = true> 
let db = dbSchema.GetDataContext() 

la mia domanda:

query { 
    for county in db.Dbo.Countries do 
    groupBy county.CountryCode into g 
    select (g.Key, g.Count()) 
    } |> Seq.iter (fun (key, count) -> printfn "%s %d" key count) 

ho ottenuto questo errore:

System.Exception: metodo non riconosciuta chiamata a Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter.EvaluateQuotation (FSharpExpr e) a Microsoft.FSharp.Linq.QueryModule.EvalNonNestedInner (CanEliminate canElim, FSharpExpr queryProducingSequence) di Microsoft. FSharp.Linq.QueryModule.clo @ 1735-1.Microsoft-FSharp-Linq-ForwardDeclarations-IQueryMethods-Executea, b a. $ FSI_0003.main @() in C: \ Development \ CountriesParser \ Script1.fsx: riga 36

La riga 36 è la riga esatta di groupBy.

Come ho letto in queste pagine, dovrebbe funzionare http://fsprojects.github.io/FSharp.Linq.ComposableQuery/QueryExamples.html https://msdn.microsoft.com/en-us/library/hh225374.aspx

+0

Non vedo nulla di immediatamente sbagliato qui - si può comprendere che le librerie sono voi referenziamento e quali spazi dei nomi sono aperti? E come viene creato il valore 'db'? –

+0

Ho modificato la mia domanda e ho aggiunto il codice prima di eseguire una query, grazie –

risposta

2

C'è un certo numero di diversi fornitori di tipo SQL per F # e penso che il codice utilizza una community-driven che non supporta il groupBy costrutto al momento.

  1. Il tipo SqlDataProvider proviene da SQLProvider pacchetto ed è documentato here.
  2. La libreria FSharp.Data.TypeProviders (anche distribuita con Visual Studio) è documentata here ed espone il tipo SqlDataConnection.
  3. Hai anche menzionato la libreria ComposableQuery documentata here, che è un'estensione che puoi usare sopra (2), ma non lo stai facendo nel tuo codice.

La biblioteca (1) è più bello in un certo numero di modi, ma non supporta la lingua piena di query ancora, quindi avrete probabilmente bisogno di passare a (2).

Per fare questo, riferimento solo FSharp.Data.TypeProviders (non hai bisogno degli altri due pacchetti) e poi utilizzare il tipo SqlDataConnection, a seguito della MSDN Walkthrough on the topic