【问题标题】:F# 3.0 LINQ groupBy sample mistakeF# 3.0 LINQ groupBy 示例错误
【发布时间】:2012-01-29 17:50:27
【问题描述】:

我正在使用 F# 3.0 学习 LINQ。尝试通过此 URL 中的“查询表达式 (F#)”来遵循示例:http://msdn.microsoft.com/en-us/library/hh225374%28v=vs.110%29.aspx

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

创建表 [dbo].[学生] ( [学生 ID] INT NOT NULL, [名称] NVARCHAR (50) 非空, [年龄] INT NULL, 主键集群([StudentID] ASC) );

然后添加几行:

插入学生(学生 ID、姓名、年龄) 值(1,“阿伯克龙比,金”,10); 插入学生(学生 ID、姓名、年龄) 值(2,'Abolrous,Hazen',14); 插入学生(学生 ID、姓名、年龄) 值(3,“汉斯,吉姆”,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())
      }

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

【问题讨论】:

    标签: linq-to-sql f#


    【解决方案1】:

    我猜你想念

    open System.Linq
    

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

    【讨论】:

    • 嗨,维克托:太好了!你的建议是正确的。但是,对于互联网上的示例代码,没有这样的开放 System.Linq。所以,我想不光是我,可能很多人都不知道!
    【解决方案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# 流水线运算符 |&gt; 可能工作得更好,因为 F# 类型推断更适合它们。

    【讨论】:

    • 嗨 Tomas:你总是提供很好的答案。您的代码似乎更容易理解!非常感谢!
    • @Tomas:F# 的 Linq2SQL 是否足够聪明,可以将 Seq.length 转换为 SQL 的 COUNT(*),否则选择将在内存中执行?
    • @Wiktor:我也很好奇。
    【解决方案3】:

    我知道这篇文章有点旧,但我最近遇到了和 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
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多