F#:如何使用SQL数据源创建Deedle Frame

时间:2013-12-15 19:58:18

标签: sql f# deedle

当数据来自SQL服务器时,我试图找出在F#中创建Deedle Frame的最佳方法。我尝试过以下内容。

#I "../packages/Deedle.0.9.12"
#load "Deedle.fsx"

#r "System.dll"
#r "System.Data.dll"
#r "System.Data.Linq"
#r "FSharp.Data.TypeProviders.dll"

open System
open System.Data
open System.Data.Linq
open Microsoft.FSharp.Data.TypeProviders
open Deedle

type dbSchema = SqlDataConnection<"Data Source=server;Initial     Catalog=database;Integrated Security=SSPI;">
let db = dbSchema.GetDataContext()

let fr = db.SomeTable |> Frame.ofRows

以及其他一些变种。但没有运气。我是F#和Deedle的新手。 我可以看出上面的原因不起作用(Frame.ofRows与参数不兼容)但我不知道最好的方法是什么(甚至如何继续)。

1 个答案:

答案 0 :(得分:9)

Frame.ofRows函数需要一系列表示帧的各行的序列。与Frame.ofColumns类似,如果您已经有一些系列对象(或者如果您从头开始创建所有内容),则此函数很有用。他们接受seq<'TRowKey * ISeries<'TColKey>>类型的输入。

当您从某些.NET数据结构创建Deedle框架时,您可以使用Frame.ofRecords来处理任何序列,它将使用反射来获取属性的名称(并将它们视为列名称) )。

一个很长的解释,但代码中只有几个字符发生变化:-)。我用Northwind测试了它:

type Nwind = SqlDataConnection<"""Data Source=.\SQLExpress;
  Initial Catalog=Northwind;Integrated Security=SSPI;""">
let db = Nwind.GetDataContext()

// Create data frame from Products table (with appropriate column names)
let fr = db.Products |> Frame.ofRecords

结果是:

      ProductID ProductName                      SupplierID CategoryID QuantityPerUnit     UnitPrice UnitsInStock UnitsOnOrder ReorderLevel Discontinued OrderDetails                               Categories Suppliers 
0  -> 1         Chai                             1          1          10 boxes x 20 bags  18.0000   39           0            10           False        System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
1  -> 2         Chang                            1          1          24 - 12 oz bottles  19.0000   17           40           25           False        System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
2  -> 3         Aniseed Syrup                    1          2          12 - 550 ml bottles 10.0000   13           70           25           False        System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
3  -> 4         Chef Anton's Cajun Seasoning     2          2          48 - 6 oz jars      22.0000   53           0            0            False        System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
4  -> 5         Chef Anton's Gumbo Mix           2          2          36 boxes            21.3500   0            0            0            True         System.Data.Linq.EntitySet`1[OrderDetails] Categories Suppliers 
(....)