我正在使用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())
}
如果我错过了什么或想错了,请告诉我。 谢谢, 约翰
答案 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
}