5

I am trying to figure what is the best way in F# to create a Deedle Frame, when the data comes from an SQL server. I have tried things like the following.

#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

and a few other variants. But without luck. I am new to both F# and Deedle for that matter. I can see why the above does not work (the Frame.ofRows is not compatible with the argument) but I don't know what is the best way to proceed (or even how to proceed).

4

1 回答 1

9

Frame.ofRows函数需要一个序列序列,这些序列代表帧的各个行。与 类似Frame.ofColumns,如果您已经有一些系列对象(或者如果您从头开始创建所有内容),则此功能很有用。他们接受 type 的输入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 
(....)
于 2013-12-16T00:48:02.460 回答