F # 3.0 LINQ groupВ случае ошибки - PullRequest
2 голосов
/ 29 января 2012

Я учусь LINQ с F # 3.0.Попытайтесь следовать примерам «Выражения запросов (F #)» с этого URL: http://msdn.microsoft.com/en-us/library/hh225374%28v=vs.110%29.aspx

Я создал простую таблицу данных в SQL Server 2008 R2, имя базы данных - myDatabase.Создайте простую таблицу данных, как указано в примере:

CREATE TABLE [dbo]. [Student] ([StudentID] INT NOT NULL, [Имя] NVARCHAR (50) NOT NULL, [Age] INT NULL,ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРНЫЙ ([StudentID] ASC));

Затем добавьте несколько строк:

INSERT INTO Student (StudentID, Name, Age) VALUES (1, 'Abercrombie, Kim', 10);INSERT INTO Student (StudentID, Имя, Возраст) ЦЕННОСТИ (2, «Abolrous, Hazen», 14);INSERT INTO Student (StudentID, Имя, Возраст) ЦЕННОСТИ (3, «Ханс, Джим», 12);INSERT INTO Student (StudentID, Name, Age) VALUES (4, «Адамс, Терри», 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' не определены

Я думаю, что Count () является встроенной функцией, но это не так.Подскажите, как я могу использовать пример кода.Или, если это ошибка, покажите мне, код может сделать эту работу.Кстати, я полагаю, что другой пример: groupValBy имеет ту же проблему.Пример кода с веб-сайта:

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

Дайте мне знать, если я что-то упустил или неправильно думаю.Спасибо, Джон

Ответы [ 3 ]

4 голосов
/ 29 января 2012

Полагаю, вы пропустили

open System.Linq

Count() - это определенный здесь метод расширения.

2 голосов
/ 29 января 2012

Если вы хотите использовать метод расширения .NET Count(), то ответ Wiktor - путь.Я думаю, что это действительно лучший подход в вашем случае.Однако вы также можете написать запрос альтернативно, используя стандартные функции F # из модуля Seq:

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 голосов
/ 15 сентября 2016

Я знаю, что это сообщение немного устарело, но у меня недавно была та же проблема, что и у OP

количество может быть добавлено как последнее утверждение, см. Ниже

не забывайте пространство имен откройте Microsoft.FSharp.Linq.RuntimeHelpers

Обратите внимание также на представление Tdate как Tdate.Value. Date позволяет обойти проблему с типами Nullable в запросах f # ​​linq.

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
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...