F#3.0 LINQ groupBy样本错误

时间:2012-01-29 17:50:28

标签: linq-to-sql f#

我正在使用F#3.0学习LINQ。尝试按照此网址中的“查询表达式(F#)”按照示例进行操作:http://msdn.microsoft.com/en-us/library/hh225374%28v=vs.110%29.aspx

我在SQL Server 2008 R2中创建了一个简单的数据表,数据库名称是myDatabase。 创建一个简单的数据表,如示例中所示:

CREATE TABLE [dbo]。[学生](     [StudentID] INT NOT NULL,     [名称] NVARCHAR(50)NOT NULL,     [年龄] INT NULL,     主要集群([StudentID] ASC) );

然后添加几行:

INSERT INTO学生(学生ID,姓名,年龄) VALUES(1,'Abercrombie,Kim',10); 插入学生(学生ID,姓名,年龄) 价值观(2,'Abolrous,Hazen',14); 插入学生(学生ID,姓名,年龄) 价值观(3,'Hance,Jim',12); 插入学生(学生ID,姓名,年龄) 价值观(4,'亚当斯,特里',12); 插入学生(学生ID,姓名,年龄) 价值观(5,'汉森,克劳斯',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”

我认为Count()是一个内置函数,但事实并非如此。 告诉我如何使用示例代码。或者,如果是错误,请告诉我代码可以完成这项工作。 顺便说一句,我相信另一个样本:groupValBy有同样的问题。 来自网站的代码示例是:

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

如果我错过了什么或想错了,请告诉我。 谢谢, 约翰

3 个答案:

答案 0 :(得分:4)

我的猜测是你想念

open System.Linq

Count()是在那里定义的扩展方法。

答案 1 :(得分: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#类型推断有效对他们更好。

答案 2 :(得分:0)

我知道这篇文章有点老但我最近和OP有同样的问题

count可以添加为最后一个语句,见下文

不要忘记命名空间 打开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
        }