2012-01-29 27 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 
     }