2012-01-29 29 views
2

我正在學習LINQ與F#3.0。嘗試通過以下URL中的「查詢表達式(F#)」示例:http://msdn.microsoft.com/en-us/library/hh225374%28v=vs.110%29.aspxF#3.0 LINQ groupBy樣本錯誤

我在SQL Server 2008 R2中創建了一個簡單的數據表,數據庫名稱爲myDatabase。 創建作爲所述樣品中指示的一個簡單的數據表:

CREATE TABLE [DBO] [學生]( [StudentID] INT NOT NULL, [名稱] NVARCHAR(50)NOT NULL, [年齡] INT NULL, PRIMARY KEY CLUSTERED([StudentID] ASC) );

再加入幾行:

INSERT INTO學生(StudentID,姓名,年齡) VALUES(1, '阿伯克龍比,金',10); INSERT INTO Student(StudentID,Name,Age) VALUES(2,'Abolrous,Hazen',14); INSERT INTO Student(StudentID,Name,Age) VALUES(3,'Hance,Jim',12); INSERT INTO Student(StudentID,Name,Age) VALUES(4,'Adams,Terry',12); INSERT INTO Student(StudentID,Name,Age) VALUES(5,'Hansen,Claus',11);

試着去了解什麼是GROUPBY樣品中,下面是我的代碼:

#light 
open System 
open System.Data 
open System.Data.Linq 
open Microsoft.FSharp.Data.TypeProviders 
open Microsoft.FSharp.Linq 

[<Generate>] 
type dbSchema = SqlDataConnection<"Data Source=.;Initial Catalog=myDatabase;Integrated Security=True"> 
let db = dbSchema.GetDataContext() 

let groupX = 
    query { 
      for student in db.Student do 
      groupBy student.Age into g 
      select (g.Key, g.Count()) 
      } 

但是,我得到了編譯器錯誤: 錯誤的域,構造或成員「計數」沒有定義

我在想Count()是一個內置函數,但事實並非如此。 告訴我如何使用示例代碼。或者,如果這是一個錯誤,請告訴我代碼可以完成這項工作。順便說一句,我相信另一個樣本:groupValBy有同樣的問題。 從網站的代碼示例是:

query { 
     for student in db.Student do 
     groupValBy student.Name student.Age into g 
     select (g, g.Key, g.Count()) 
     } 

讓我知道如果我錯過了什麼或誤以爲。 謝謝, 約翰

回答

4

我的猜測是,你會錯過

open System.Linq 

Count()是定義有一個擴展方法。

+0

嗨,Wiktor:太好了!你的建議是正確的。但是,對於互聯網上的示例代碼,沒有這樣開放的System.Linq。所以,我猜不僅是我,還有很多其他人可能不知道這個! – 2012-01-29 21:09:21

2

如果你想使用.NET擴展方法Count(),那麼Wiktor的答案是要走的路。我認爲這實際上是您案例中最好的方法。但是,您也可以編寫查詢或者使用來自Seq模塊標準的F#功能:

query { for student in db.Student do 
     groupValBy student.Name student.Age into g 
     select (g.Key, Seq.length g) } 

在這種情況下,g.Count()語法較短,但在一個更復雜的查詢,該Seq功能和F#流水線操作|>可能會更好,因爲F#類型推斷對他們更好。

+0

嗨托馬斯:你總是提供很好的答案。你的代碼看起來更容易理解!非常感謝你! – 2012-01-29 21:10:31

+3

@Tomas:F#的Linq2SQL足夠聰明地將Seq.length轉換爲SQL的COUNT(*),否則選擇將在內存中執行? – 2012-01-29 21:24:35

+0

@Wiktor:我也很好奇。 – ildjarn 2012-01-30 18:18:51

0

我知道這個帖子是有點老,但我最近

有相同的問題OP

計數可以作爲最後的陳述見下文

不要忘記的 開放Microsoft.FSharp.Linq.RuntimeHelpers命名空間

還要注意Tdate的表示形式爲Tdate.Value.Date,它解決了f#linq查詢中的Nullable類型的問題。

let distinctCounts = 
    query { 
     for row in db.TblTable do 
     where (row.Tdate.Value.Date >= stdate && row.Tdate.Value.Date <= enddate) 
     let key2 = AnonymousObject<_,_>(row.Key, row.Tdate) 
     groupBy key2 
     count 
     }