2013-12-15 51 views
5

我想知道當數據來自SQL服務器時,什麼是F#中創建Deedle框架的最佳方式。我嘗試了以下的東西。F#:如何使用SQL數據源創建一個Deedle框架

#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與參數不兼容),但我不知道什麼是繼續進行(甚至如何繼續)的最佳方式。

+0

對於這裏的基本用戶是有幫助的點出*見*在所示的結果 「結果是:」你需要調用Frame.Print(),以上例子fr.Print() – user1796185

回答

9

Frame.ofRows函數需要一系列表示幀的各個行的序列。與Frame.ofColumns類似,如果您已經有一些系列對象(或者您從頭開始創建所有內容),則此功能非常有用。他們採用seq<'TRowKey * ISeries<'TColKey>>類型的輸入。

當您從某些.NET數據結構創建Deedle框架時,您可以使用Frame.ofRecords,它可以在任何序列上工作,它將使用反射來獲取屬性的名稱(並將它們視爲列名稱)。

很長的解釋,但只是幾個字符在你的代碼中改變:-)。我羅斯文測試它:

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 
(....) 
+0

完美!非常感謝。看過該方法,但認爲它只適用於定義「常用方式」的記錄。如果我想說兩列來定義密鑰,那麼鍵入幀的最佳方式是什麼?一天,一小時? – Stefan