La programmazione del database F # è uguale alla programmazione del database C #?
Domanda
Affinché f # parli con un database, suppongo che ti rivolgi a un codice che assomiglia molto al codice C #, usando alcune librerie NET (ado.net per esempio) e un sacco di codice imperativo che ha, per definizione , molti effetti collaterali ..
O mi sto perdendo qualcosa qui? F # ha qualche bellezza da offrire anche in questo dominio?
E qualcuno sarebbe così gentile da fornirmi un esempio sia per leggere da una scrittura su un database?
Soluzione
Potresti voler utilizzare la risposta accettata in questa domanda come un buon punto di partenza.
Principiante F #: recupero di una matrice di dati da un server
A seconda del database che stai utilizzando potresti avere altre scelte, ma inizia con qualcosa di abbastanza funzionale e puoi migliorarlo man mano che acquisisci esperienza.
Altri suggerimenti
Quando dovevo fare un po 'di accesso al database da F # in un progetto di test, ho finito per usare LINQ to SQL da F #. Ho appena aggiunto un progetto C # alla soluzione, ho inserito DataContext nel progetto C # e ho usato le classi CQ LINQ generate in SQL nel mio progetto F #.
Per prima cosa devi fare riferimento agli assembly FSharp.PowerPack e FSharp.PowerPack.Linq . Quindi puoi aprire Microsoft.FSharp.Linq
.
Ecco un esempio che analizza " Sito " tag da un XDocument, creando istanze della classe Site
(una classe LINQ to SQL generata da C #), quindi inserendole nel database usando il contesto di dati L2S.
let sites = doc.Descendants(ns + "Site")
|> Seq.map (fun el -> new Site (
Url = xstr(el.Element(ns + "DataUrl")),
Rank = xint(el.Element(ns + "Rank"))
))
use db = new SomeDataContext()
db.Sites.InsertAllOnSubmit(sites)
db.SubmitChanges()
Come puoi vedere, anche se sta usando le classi C #, non è un codice assolutamente imperativo.
Ecco un esempio dell'uso della versione F # di LINQ per trovare il grado massimo di tutte le voci del sito nel database. Sì, questo viene tradotto in SQL ed eseguito nel database.
use db = new SomeDataContext()
Query.query <@ seq { for s in db.Sites -> s.Rank } |> Seq.max @>
Infine, ecco alcuni maggiori informazioni su LINQ con F # .