[转]查询表达式 (F#)
本文转自:http://msdn.microsoft.com/zh-cn/library/hh225374.aspx
查询表达式可以查询数据源并将数据是一种预期形式。 查询表达式提供 F# 中支持 LINQ。
- query { expression }
查询表达式是计算表达式的类型类似于序列表达式。 就象通过提供代码指定顺序在序列表达式中,可以在查询表达式指定设置数据通过提供代码。 在序列表达式,yield 关键字标识要返回的数据为产生的序列的一部分。 在查询表达式中,select 关键字执行相同的功能。 除了 select 关键字以外,F# 还支持十分类似于 SQL SELECT 语句的大量查询运算符。 这是一个简单的查询表达式的示例,与连接到 Northwind OData 源的代码。
- // Use the OData type provider to create types that can be used to access the Northwind database.
- // Add References to FSharp.Data.TypeProviders and System.Data.Services.Client
- open Microsoft.FSharp.Data.TypeProviders
- type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">
- let db = Northwind.GetDataContext()
- // A query expression.
- let query1 = query { for customer in db.Customers do
- select customer }
- query1
- |> Seq.iter (fun customer -> printfn "Company: %s Contact: %s" customer.CompanyName customer.ContactName)
在前面的代码示例中,查询表达式在大括号。 代码的含义在表达式的是,返回每个客户在 customers 表在查询结果的数据库中。 查询表达式返回实现 IQueryable<T> 和 IEnumerable<T>的类型,并且,因此可重复使用 序列模块,当此示例显示。
每个计算表达式类型从生成器选件类生成。 查询计算表达式的生成器选件类是 QueryBuilder。 有关更多信息,请参见计算表达式 (F#)和Linq.QueryBuilder 类 (F#)。
查询运算符在要返回的记录可以指定查询的详细信息,例如放置 standard 或指定结果排序顺序。 查询源必须支持查询运算符。 如果尝试使用不支持的查询运算符,NotSupportedException 将引发异常。
可以转换为 SQL 只的表达式在查询表达式中允许的。 例如,那么,当您使用 where 查询运算符时,在表达式不允许函数调用。
表 1 显示可用的查询运算符。 此外,请参见 Table2 后,比较 SQL 查询和等效的 F# 查询表达式本主题。 某些查询运算符不是由某些类型提供程序支持。 具体而言,OData 类型提供程序在查询运算符绑定到 OData 支持由于限制。 有关更多信息,请参见 ODataService 类型提供程序 (f#)。
此表假定一个数据库为以下形式:
代码还在下表中假定下列数据库连接代码。 项目应添加对 System.Data、要求和 FSharp.Data.TypeProviders 程序集。 创建此数据库的代码是组成的本主题末尾的。
- open System
- open Microsoft.FSharp.Data.TypeProviders
- open System.Data.Linq.SqlClient
- open System.Linq
- open Microsoft.FSharp.Linq
- type schema = SqlDataConnection<"Data Source=SERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">
- let db = schema.GetDataContext()
- // Needed for some query operator examples:
- let data = [ 1; 5; 7; 11; 18; 21]
运算符 |
描述 |
contains |
确定所选元素是否包含一个指定的元素。 |
count |
返回所选元素的数量。 |
last |
到目前为止选择选定的表的最后一个元素。 |
lastOrDefault |
;如果未找到至此,选择选定的表中的最后一个元素或一个默认值元素。 |
exactlyOne |
到目前为止选定的一个,特定元素。 如果多个元素存在,则将引发。 |
exactlyOneOrDefault |
;如果未找到至此,选择选定的表的唯一,特定元素或一个默认值该元素。 |
headOrDefault |
如果该序列不包含元素至此,选择选定的表的第一个元素或一个默认值。 |
select |
到目前为止项目选定的每个元素。 |
where |
根据指定谓词的元素。 |
minBy |
为选定的每个元素到目前为止选择一个值并返回最小的结果值。 |
maxBy |
为选定的每个元素到目前为止选择一个值并返回最大结果值。 |
groupBy |
到目前为止组按照指定的键选择器中选择的元素。 |
sortBy |
到目前为止对升序选择组件的特定排序的键。 |
sortByDescending |
到目前为止按降序进行选择的元素由特定排序的键。 |
thenBy |
在升序到目前为止执行特定排序的键选择哪个后续排序元素。 此运算符只能在 sortBy、sortByDescending、thenBy或 thenByDescending之后只使用。 |
thenByDescending |
按降序到目前为止执行特定排序的键选择哪个后续排序元素。 此运算符只能在 sortBy、sortByDescending、thenBy或 thenByDescending之后只使用。 |
groupValBy |
为给定键选择和组至此选择一个值元素的每个元素。 |
join |
相互关系两个基于匹配的键的设置选定的值。 请注意键的顺序在周围的 = 签名连接表达式是有意义的。 在连接,因此,如果行。-> 符号后拆分,缩进的缩进距离必须至少在关键字 for。 |
groupJoin |
相互关系两个基于匹配的键和组的设置选定的值结果。 请注意键的顺序在周围的 = 签名连接表达式是有意义的。 |
leftOuterJoin |
相互关系两个基于匹配的键和组的设置选定的值结果。 如果任何组为空,使用一组具有一个默认值。 请注意键的顺序在周围的 = 签名连接表达式是有意义的。 |
sumByNullable |
为选定的每个元素到目前为止选择一个可以为 null 的值并返回这些值的总和。 如果有可以为 null,可不具有值,它将被忽略。 |
minByNullable |
为选定的每个元素到目前为止选择一个可以为 null 的值并返回这些值最小位数。 如果有可以为 null,可不具有值,它将被忽略。 |
maxByNullable |
为选定的每个元素到目前为止选择一个可以为 null 的值并返回这些值最大次数。 如果有可以为 null,可不具有值,它将被忽略。 |
averageByNullable |
为选定的每个元素到目前为止选择一个可以为 null 的值并返回平均值这些值。 如果有可以为 null,可不具有值,它将被忽略。 |
averageBy |
为选定的每个元素到目前为止选择一个值并返回平均值这些值。 |
distinct |
到目前为止选择不同的组件从所选元素。 |
exists |
确定选定的任何元素到目前为止是否满足条件。 |
find |
选择到目前为止满足指定条件的第一个选定的元素。 |
all |
确定选定的所有元素到目前为止是否满足条件。 |
head |
到目前为止选择第一个元素从选定的表。 |
nth |
到目前为止选择元素在选定的表中的指定索引。 |
skip |
到目前为止跳过所选元素指定数目的然后选择剩余的元素。 |
skipWhile |
在序列中的元素,只要一个指定的条件为 true 的然后选择剩余的元素。 |
sumBy |
为选定的每个元素到目前为止选择一个值并返回这些值的总和。 |
take |
到目前为止选择连续的指定数量的元素从选定的表。 |
takeWhile |
选择元素序列,只要一个指定条件为 true,则跳过剩余的元素。 |
sortByNullable |
到目前为止对升序选择的元素由特定的排序的键。 |
sortByNullableDescending |
到目前为止按降序进行选择的元素由特定的排序的键。 |
thenByNullable |
在升序到目前为止执行特定的排序的键选择哪个后续排序元素。 此运算符只能在 sortBy之后只使用、sortByDescending、thenBy或 thenByDescending,也可以为 null 的变量。 |
thenByNullableDescending |
按降序到目前为止执行特定的排序的键选择哪个后续排序元素。 此运算符只能在 sortBy之后只使用、sortByDescending、thenBy或 thenByDescending,也可以为 null 的变量。 |
下表显示了 F# 的一些常见 Transact-SQL 查询与其等效项。 代码此表还假定数据库和上表与同一初始代码相同的设置类型提供程序。
Transact-SQL (不区分大小写) |
F# 查询表达式 (区分大小写) |
---|---|
选择所有字段从表。
|
|
计数记录在表中。
|
|
EXISTS
|
|
分组
|
|
分组加上条件。
|
|
分组的计数情况。
|
|
分组,计数、求和与求平均值计算。
|
|
分组,计数和排序由计数。
|
|
IN 设置指定值
|
|
LIKE 和 TOP。
|
|
与设置的模式匹配LIKE。
|
|
设置了独占模式的LIKE。
|
|
在一个字段的LIKE,但是,选择一个不同的字段。
|
|
LIKE ,将子字符串搜索。
|
|
只有两个表的简单 JOIN。
|
|
只有 两个表的LEFT JOIN。
|
|
JOIN 和 COUNT
|
|
DISTINCT
|
|
清单的计数。
|
|
BETWEEN
|
|
OR
|
|
与排序的OR
|
|
TOP ,OR和排序。
|
|
两个查询UNION。
|
|
两个查询的交集。
|
|
CASE 情况。
|
|
多个用例。
|
|
多个表。
|
|
多联接。
|
|
多个左外部联接。
|
|
下面的代码可用于创建这些示例的示例数据库。
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- USE [master];
- GO
- IF EXISTS (SELECT * FROM sys.databases WHERE name = 'MyDatabase')
- DROP DATABASE MyDatabase;
- GO
- -- Create the MyDatabase database.
- CREATE DATABASE MyDatabase COLLATE SQL_Latin1_General_CP1_CI_AS;
- GO
- -- Specify a simple recovery model
- -- to keep the log growth to a minimum.
- ALTER DATABASE MyDatabase
- SET RECOVERY SIMPLE;
- GO
- USE MyDatabase;
- GO
- CREATE TABLE [dbo].[Course] (
- [CourseID] INT NOT NULL,
- [CourseName] NVARCHAR (50) NOT NULL,
- PRIMARY KEY CLUSTERED ([CourseID] ASC)
- );
- CREATE TABLE [dbo].[Student] (
- [StudentID] INT NOT NULL,
- [Name] NVARCHAR (50) NOT NULL,
- [Age] INT NULL,
- PRIMARY KEY CLUSTERED ([StudentID] ASC)
- );
- CREATE TABLE [dbo].[CourseSelection] (
- [ID] INT NOT NULL,
- [StudentID] INT NOT NULL,
- [CourseID] INT NOT NULL,
- PRIMARY KEY CLUSTERED ([ID] ASC),
- CONSTRAINT [FK_CourseSelection_ToTable] FOREIGN KEY ([StudentID]) REFERENCES [dbo].[Student] ([StudentID]) ON DELETE NO ACTION ON UPDATE NO ACTION,
- CONSTRAINT [FK_CourseSelection_Course_1] FOREIGN KEY ([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) ON DELETE NO ACTION ON UPDATE NO ACTION
- );
- CREATE TABLE [dbo].[LastStudent] (
- [StudentID] INT NOT NULL,
- [Name] NVARCHAR (50) NOT NULL,
- [Age] INT NULL,
- PRIMARY KEY CLUSTERED ([StudentID] ASC)
- );
- -- Insert data into the tables.
- USE MyDatabase
- INSERT INTO Course (CourseID, CourseName)
- VALUES(1, 'Algebra I');
- INSERT INTO Course (CourseID, CourseName)
- VALUES(2, 'Trigonometry');
- INSERT INTO Course (CourseID, CourseName)
- VALUES(3, 'Algebra II');
- INSERT INTO Course (CourseID, CourseName)
- VALUES(4, 'History');
- INSERT INTO Course (CourseID, CourseName)
- VALUES(5, 'English');
- INSERT INTO Course (CourseID, CourseName)
- VALUES(6, 'French');
- INSERT INTO Course (CourseID, CourseName)
- VALUES(7, 'Chinese');
- INSERT INTO Student (StudentID, Name, Age)
- VALUES(1, 'Abercrombie, Kim', 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);
- INSERT INTO Student (StudentID, Name, Age)
- VALUES(6, 'Penor, Lori', 13);
- INSERT INTO Student (StudentID, Name, Age)
- VALUES(7, 'Perham, Tom', 12);
- INSERT INTO Student (StudentID, Name, Age)
- VALUES(8, 'Peng, Yun-Feng', NULL);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(1, 1, 2);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(2, 1, 3);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(3, 1, 5);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(4, 2, 2);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(5, 2, 5);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(6, 2, 6);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(7, 2, 3);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(8, 3, 2);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(9, 3, 1);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(10, 4, 2);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(11, 4, 5);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(12, 4, 2);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(13, 5, 3);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(14, 5, 2);
- INSERT INTO CourseSelection (ID, StudentID, CourseID)
- VALUES(15, 7, 3);
下面的代码包含显示在本主题的代码示例。
- #if INTERACTIVE
- #r "FSharp.Data.TypeProviders.dll"
- #r "System.Data.dll"
- #r "System.Data.Linq.dll"
- #endif
- open System
- open Microsoft.FSharp.Data.TypeProviders
- open System.Data.Linq.SqlClient
- open System.Linq
- [<Generate>]
- type schema = SqlDataConnection<"Data Source=SERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">
- let db = schema.GetDataContext()
- let student = db.Student
- let data = [1; 5; 7; 11; 18; 21]
- open System
- type Nullable<'T when 'T : ( new : unit -> 'T) and 'T : struct and 'T :> ValueType > with
- member this.Print() =
- if (this.HasValue) then this.Value.ToString()
- else "NULL"
- printfn "\ncontains query operator"
- query {
- for student in db.Student do
- select student.Age.Value
- contains 11
- }
- |> printfn "Is at least one student age 11? %b"
- printfn "\ncount query operator"
- query {
- for student in db.Student do
- select student
- count
- }
- |> printfn "Number of students: %d"
- printfn "\nlast query operator."
- let num =
- query {
- for number in data do
- sortBy number
- last
- }
- printfn "Last number: %d" num
- open Microsoft.FSharp.Linq
- printfn "\nlastOrDefault query operator."
- query {
- for number in data do
- sortBy number
- lastOrDefault
- }
- |> printfn "lastOrDefault: %d"
- printfn "\nexactlyOne query operator."
- let student2 =
- query {
- for student in db.Student do
- where (student.StudentID = 1)
- select student
- exactlyOne
- }
- printfn "Student with StudentID = 1 is %s" student2.Name
- printfn "\nexactlyOneOrDefault query operator."
- let student3 =
- query {
- for student in db.Student do
- where (student.StudentID = 1)
- select student
- exactlyOneOrDefault
- }
- printfn "Student with StudentID = 1 is %s" student3.Name
- printfn "\nheadOrDefault query operator."
- let student4 =
- query {
- for student in db.Student do
- select student
- headOrDefault
- }
- printfn "head student is %s" student4.Name
- printfn "\nselect query operator."
- query {
- for student in db.Student do
- select student
- }
- |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
- printfn "\nwhere query operator."
- query {
- for student in db.Student do
- where (student.StudentID > 4)
- select student
- }
- |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
- printfn "\nminBy query operator."
- let student5 =
- query {
- for student in db.Student do
- minBy student.StudentID
- }
- printfn "\nmaxBy query operator."
- let student6 =
- query {
- for student in db.Student do
- maxBy student.StudentID
- }
- printfn "\ngroupBy query operator."
- query {
- for student in db.Student do
- groupBy student.Age into g
- select (g.Key, g.Count())
- }
- |> Seq.iter (fun (age, count) -> printfn "Age: %s Count at that age: %d" (age.Print()) count)
- printfn "\nsortBy query operator."
- query {
- for student in db.Student do
- sortBy student.Name
- select student
- }
- |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
- printfn "\nsortByDescending query operator."
- query {
- for student in db.Student do
- sortByDescending student.Name
- select student
- }
- |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
- printfn "\nthenBy query operator."
- query {
- for student in db.Student do
- where student.Age.HasValue
- sortBy student.Age.Value
- thenBy student.Name
- select student
- }
- |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.Age.Value student.Name)
- printfn "\nthenByDescending query operator."
- query {
- for student in db.Student do
- where student.Age.HasValue
- sortBy student.Age.Value
- thenByDescending student.Name
- select student
- }
- |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.Age.Value student.Name)
- printfn "\ngroupValBy query operator."
- query {
- for student in db.Student do
- groupValBy student.Name student.Age into g
- select (g, g.Key, g.Count())
- }
- |> Seq.iter (fun (group, age, count) ->
- printfn "Age: %s Count at that age: %d" (age.Print()) count
- group |> Seq.iter (fun name -> printfn "Name: %s" name))
- printfn "\n sumByNullable query operator"
- query {
- for student in db.Student do
- sumByNullable student.Age
- }
- |> (fun sum -> printfn "Sum of ages: %s" (sum.Print()))
- printfn "\n minByNullable"
- query {
- for student in db.Student do
- minByNullable student.Age
- }
- |> (fun age -> printfn "Minimum age: %s" (age.Print()))
- printfn "\n maxByNullable"
- query {
- for student in db.Student do
- maxByNullable student.Age
- }
- |> (fun age -> printfn "Maximum age: %s" (age.Print()))
- printfn "\n averageBy"
- query {
- for student in db.Student do
- averageBy (float student.StudentID)
- }
- |> printfn "Average student ID: %f"
- printfn "\n averageByNullable"
- query {
- for student in db.Student do
- averageByNullable (Nullable.float student.Age)
- }
- |> (fun avg -> printfn "Average age: %s" (avg.Print()))
- printfn "\n find query operator"
- query {
- for student in db.Student do
- find (student.Name = "Abercrombie, Kim")
- }
- |> (fun student -> printfn "Found a match with StudentID = %d" student.StudentID)
- printfn "\n all query operator"
- query {
- for student in db.Student do
- all (SqlMethods.Like(student.Name, "%,%"))
- }
- |> printfn "Do all students have a comma in the name? %b"
- printfn "\n head query operator"
- query {
- for student in db.Student do
- head
- }
- |> (fun student -> printfn "Found the head student with StudentID = %d" student.StudentID)
- printfn "\n nth query operator"
- query {
- for numbers in data do
- nth 3
- }
- |> printfn "Third number is %d"
- printfn "\n skip query operator"
- query {
- for student in db.Student do
- skip 1
- }
- |> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
- printfn "\n skipWhile query operator"
- query {
- for number in data do
- skipWhile (number < 3)
- select number
- }
- |> Seq.iter (fun number -> printfn "Number = %d" number)
- printfn "\n sumBy query operator"
- query {
- for student in db.Student do
- sumBy student.StudentID
- }
- |> printfn "Sum of student IDs: %d"
- printfn "\n take query operator"
- query {
- for student in db.Student do
- select student
- take 2
- }
- |> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
- printfn "\n takeWhile query operator"
- query {
- for number in data do
- takeWhile (number < 10)
- }
- |> Seq.iter (fun number -> printfn "Number = %d" number)
- printfn "\n sortByNullable query operator"
- query {
- for student in db.Student do
- sortByNullable student.Age
- select student
- }
- |> Seq.iter (fun student ->
- printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
- printfn "\n sortByNullableDescending query operator"
- query {
- for student in db.Student do
- sortByNullableDescending student.Age
- select student
- }
- |> Seq.iter (fun student ->
- printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
- printfn "\n thenByNullable query operator"
- query {
- for student in db.Student do
- sortBy student.Name
- thenByNullable student.Age
- select student
- }
- |> Seq.iter (fun student ->
- printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
- printfn "\n thenByNullableDescending query operator"
- query {
- for student in db.Student do
- sortBy student.Name
- thenByNullableDescending student.Age
- select student
- }
- |> Seq.iter (fun student ->
- printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
- printfn "All students: "
- query {
- for student in db.Student do
- select student
- }
- |> Seq.iter (fun student -> printfn "%s %d %s" student.Name student.StudentID (student.Age.Print()))
- printfn "\nCount of students: "
- query {
- for student in db.Student do
- count
- }
- |> (fun count -> printfn "Student count: %d" count)
- printfn "\nExists."
- query {
- for student in db.Student do
- where (query { for courseSelection in db.CourseSelection do
- exists (courseSelection.StudentID = student.StudentID) })
- select student }
- |> Seq.iter (fun student -> printfn "%A" student.Name)
- printfn "\n Group by age and count"
- query {
- for n in db.Student do
- groupBy n.Age into g
- select (g.Key, g.Count())
- }
- |> Seq.iter (fun (age, count) -> printfn "%s %d" (age.Print()) count)
- printfn "\n Group value by age."
- query {
- for n in db.Student do
- groupValBy n.Age n.Age into g
- select (g.Key, g.Count())
- }
- |> Seq.iter (fun (age, count) -> printfn "%s %d" (age.Print()) count)
- printfn "\nGroup students by age where age > 10."
- query {
- for student in db.Student do
- groupBy student.Age into g
- where (g.Key.HasValue && g.Key.Value > 10)
- select (g, g.Key)
- }
- |> Seq.iter (fun (students, age) ->
- printfn "Age: %s" (age.Value.ToString())
- students
- |> Seq.iter (fun student -> printfn "%s" student.Name))
- printfn "\nGroup students by age and print counts of number of students at each age with more than 1 student."
- query {
- for student in db.Student do
- groupBy student.Age into group
- where (group.Count() > 1)
- select (group.Key, group.Count())
- }
- |> Seq.iter (fun (age, ageCount) ->
- printfn "Age: %s Count: %d" (age.Print()) ageCount)
- printfn "\nGroup students by age and sum ages."
- query {
- for student in db.Student do
- groupBy student.Age into g
- let total = query { for student in g do sumByNullable student.Age }
- select (g.Key, g.Count(), total)
- }
- |> Seq.iter (fun (age, count, total) ->
- printfn "Age: %d" (age.GetValueOrDefault())
- printfn "Count: %d" count
- printfn "Total years: %s" (total.ToString()))
- printfn "\nGroup students by age and count number of students at each age, and display all with count > 1 in descending order of count."
- query {
- for student in db.Student do
- groupBy student.Age into g
- where (g.Count() > 1)
- sortByDescending (g.Count())
- select (g.Key, g.Count())
- }
- |> Seq.iter (fun (age, myCount) ->
- printfn "Age: %s" (age.Print())
- printfn "Count: %d" myCount)
- printfn "\n Select students from a set of IDs"
- let idList = [1; 2; 5; 10]
- let idQuery = query { for id in idList do
- select id }
- query {
- for student in db.Student do
- where (idQuery.Contains(student.StudentID))
- select student
- }
- |> Seq.iter (fun student ->
- printfn "Name: %s" student.Name)
- printfn "\nLook for students with Name match _e%% pattern and take first two."
- query {
- for student in db.Student do
- where (SqlMethods.Like( student.Name, "_e%") )
- select student
- take 2
- }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\nLook for students with Name matching [abc]%% pattern."
- query {
- for student in db.Student do
- where (SqlMethods.Like( student.Name, "[abc]%") )
- select student
- }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\nLook for students with name matching [^abc]%% pattern."
- query {
- for student in db.Student do
- where (SqlMethods.Like( student.Name, "[^abc]%") )
- select student
- }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\nLook for students with name matching [^abc]%% pattern and select ID."
- query {
- for n in db.Student do
- where (SqlMethods.Like( n.Name, "[^abc]%") )
- select n.StudentID
- }
- |> Seq.iter (fun id -> printfn "%d" id)
- printfn "\n Using Contains as a query filter."
- query {
- for student in db.Student do
- where (student.Name.Contains("a"))
- select student
- }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\nSearching for names from a list."
- let names = [|"a";"b";"c"|]
- query {
- for student in db.Student do
- if names.Contains (student.Name) then select student }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\nJoin Student and CourseSelection tables."
- query {
- for student in db.Student do
- join (for selection in db.CourseSelection ->
- student.StudentID = selection.StudentID)
- select (student, selection)
- }
- |> Seq.iter (fun (student, selection) -> printfn "%d %s %d" student.StudentID student.Name selection.CourseID)
- printfn "\nLeft Join Student and CourseSelection tables."
- query {
- for student in db.Student do
- leftOuterJoin (for selection in db.CourseSelection ->
- student.StudentID = selection.StudentID) into result
- for selection in result.DefaultIfEmpty() do
- select (student, selection)
- }
- |> Seq.iter (fun (student, selection) ->
- let selectionID, studentID, courseID =
- match selection with
- | null -> "NULL", "NULL", "NULL"
- | sel -> (sel.ID.ToString(), sel.StudentID.ToString(), sel.CourseID.ToString())
- printfn "%d %s %d %s %s %s" student.StudentID student.Name (student.Age.GetValueOrDefault()) selectionID studentID courseID)
- printfn "\nJoin with count"
- query {
- for n in db.Student do
- join (for e in db.CourseSelection -> n.StudentID = e.StudentID)
- count
- }
- |> printfn "%d"
- printfn "\n Join with distinct."
- query {
- for student in db.Student do
- join (for selection in db.CourseSelection ->
- student.StudentID = selection.StudentID)
- distinct
- }
- |> Seq.iter (fun (student, selection) -> printfn "%s %d" student.Name selection.CourseID)
- printfn "\n Join with distinct and count."
- query {
- for n in db.Student do
- join (for e in db.CourseSelection -> n.StudentID = e.StudentID)
- distinct
- count
- }
- |> printfn "%d"
- printfn "\n Selecting students with age between 10 and 15."
- query {
- for student in db.Student do
- where (student.Age.Value >= 10 && student.Age.Value < 15)
- select student
- }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\n Selecting students with age either 11 or 12."
- query {
- for student in db.Student do
- where (student.Age.Value = 11 || student.Age.Value = 12)
- select student
- }
- |> Seq.iter (fun student -> printfn "%s" student.Name)
- printfn "\n Selecting students in a certain age range and sorting."
- query {
- for n in db.Student do
- where (n.Age.Value = 12 || n.Age.Value = 13)
- sortByNullableDescending n.Age
- select n
- }
- |> Seq.iter (fun student -> printfn "%s %s" student.Name (student.Age.Print()))
- printfn "\n Selecting students with certain ages, taking account of possibility of nulls."
- query {
- for student in db.Student do
- where ((student.Age.HasValue && student.Age.Value = 11) ||
- (student.Age.HasValue && student.Age.Value = 12))
- sortByDescending student.Name
- select student.Name
- take 2
- }
- |> Seq.iter (fun name -> printfn "%s" name)
- printfn "\n Union of two queries."
- module Queries =
- let query1 = query {
- for n in db.Student do
- select (n.Name, n.Age)
- }
- let query2 = query {
- for n in db.LastStudent do
- select (n.Name, n.Age)
- }
- query2.Union (query1)
- |> Seq.iter (fun (name, age) -> printfn "%s %s" name (age.Print()))
- printfn "\n Intersect of two queries."
- module Queries2 =
- let query1 = query {
- for n in db.Student do
- select (n.Name, n.Age)
- }
- let query2 = query {
- for n in db.LastStudent do
- select (n.Name, n.Age)
- }
- query1.Intersect(query2)
- |> Seq.iter (fun (name, age) -> printfn "%s %s" name (age.Print()))
- printfn "\n Using if statement to alter results for special value."
- query {
- for student in db.Student do
- select (if student.Age.HasValue && student.Age.Value = -1 then
- (student.StudentID, System.Nullable<int>(100), student.Age)
- else (student.StudentID, student.Age, student.Age))
- }
- |> Seq.iter (fun (id, value, age) -> printfn "%d %s %s" id (value.Print()) (age.Print()))
- printfn "\n Using if statement to alter results special values."
- query {
- for student in db.Student do
- select (if student.Age.HasValue && student.Age.Value = -1 then
- (student.StudentID, System.Nullable<int>(100), student.Age)
- elif student.Age.HasValue && student.Age.Value = 0 then
- (student.StudentID, System.Nullable<int>(100), student.Age)
- else (student.StudentID, student.Age, student.Age))
- }
- |> Seq.iter (fun (id, value, age) -> printfn "%d %s %s" id (value.Print()) (age.Print()))
- printfn "\n Multiple table select."
- query {
- for student in db.Student do
- for course in db.Course do
- select (student, course)
- }
- |> Seq.iteri (fun index (student, course) ->
- if (index = 0) then printfn "StudentID Name Age CourseID CourseName"
- printfn "%d %s %s %d %s" student.StudentID student.Name (student.Age.Print()) course.CourseID course.CourseName)
- printfn "\nMultiple Joins"
- query {
- for student in db.Student do
- join courseSelection in db.CourseSelection on
- (student.StudentID = courseSelection.StudentID)
- join course in db.Course on
- (courseSelection.CourseID = course.CourseID)
- select (student.Name, course.CourseName)
- }
- |> Seq.iter (fun (studentName, courseName) -> printfn "%s %s" studentName courseName)
- printfn "\nMultiple Left Outer Joins"
- query {
- for student in db.Student do
- leftOuterJoin (for courseSelection in db.CourseSelection ->
- student.StudentID = courseSelection.StudentID) into g1
- for courseSelection in g1.DefaultIfEmpty() do
- leftOuterJoin (for course in db.Course ->
- courseSelection.CourseID = course.CourseID) into g2
- for course in g2.DefaultIfEmpty() do
- select (student.Name, course.CourseName)
- }
- |> Seq.iter (fun (studentName, courseName) -> printfn "%s %s" studentName courseName)
对于完全的输出,当此代码在 F# interactive 时运行。
- --> Referenced 'C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\Type Providers\FSharp.Data.TypeProviders.dll'
- --> Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll'
- --> Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.Linq.dll'
- contains query operator
- Binding session to 'C:\Users\ghogen\AppData\Local\Temp\tmp5E3C.dll'... Binding session to 'C:\Users\ghogen\AppData\Local\Temp\tmp611A.dll'... Is at least one student age 11? true
- count query operator
- Number of students: 8
- last query operator. Last number: 21
- lastOrDefault query operator. lastOrDefault: 21
- exactlyOne query operator. Student with StudentID = 1 is Abercrombie, Kim
- exactlyOneOrDefault query operator. Student with StudentID = 1 is Abercrombie, Kim
- headOrDefault query operator. head student is Abercrombie, Kim
- select query operator. StudentID, Name: 1 Abercrombie, Kim
- StudentID, Name: 2 Abolrous, Hazen
- StudentID, Name: 3 Hance, Jim
- StudentID, Name: 4 Adams, Terry
- StudentID, Name: 5 Hansen, Claus
- StudentID, Name: 6 Penor, Lori
- StudentID, Name: 7 Perham, Tom
- StudentID, Name: 8 Peng, Yun-Feng
- where query operator. StudentID, Name: 5 Hansen, Claus
- StudentID, Name: 6 Penor, Lori
- StudentID, Name: 7 Perham, Tom
- StudentID, Name: 8 Peng, Yun-Feng
- minBy query operator. maxBy query operator. groupBy query operator. Age: NULL Count at that age: 1
- Age: 10 Count at that age: 1
- Age: 11 Count at that age: 1
- Age: 12 Count at that age: 3
- Age: 13 Count at that age: 1
- Age: 14 Count at that age: 1
- sortBy query operator. StudentID, Name: 1 Abercrombie, Kim
- StudentID, Name: 2 Abolrous, Hazen
- StudentID, Name: 4 Adams, Terry
- StudentID, Name: 3 Hance, Jim
- StudentID, Name: 5 Hansen, Claus
- StudentID, Name: 8 Peng, Yun-Feng
- StudentID, Name: 6 Penor, Lori
- StudentID, Name: 7 Perham, Tom
- sortByDescending query operator. StudentID, Name: 7 Perham, Tom
- StudentID, Name: 6 Penor, Lori
- StudentID, Name: 8 Peng, Yun-Feng
- StudentID, Name: 5 Hansen, Claus
- StudentID, Name: 3 Hance, Jim
- StudentID, Name: 4 Adams, Terry
- StudentID, Name: 2 Abolrous, Hazen
- StudentID, Name: 1 Abercrombie, Kim
- thenBy query operator. StudentID, Name: 10 Abercrombie, Kim
- StudentID, Name: 11 Hansen, Claus
- StudentID, Name: 12 Adams, Terry
- StudentID, Name: 12 Hance, Jim
- StudentID, Name: 12 Perham, Tom
- StudentID, Name: 13 Penor, Lori
- StudentID, Name: 14 Abolrous, Hazen
- thenByDescending query operator. StudentID, Name: 10 Abercrombie, Kim
- StudentID, Name: 11 Hansen, Claus
- StudentID, Name: 12 Perham, Tom
- StudentID, Name: 12 Hance, Jim
- StudentID, Name: 12 Adams, Terry
- StudentID, Name: 13 Penor, Lori
- StudentID, Name: 14 Abolrous, Hazen
- groupValBy query operator. Age: NULL Count at that age: 1
- Name: Peng, Yun-Feng
- Age: 10 Count at that age: 1
- Name: Abercrombie, Kim
- Age: 11 Count at that age: 1
- Name: Hansen, Claus
- Age: 12 Count at that age: 3
- Name: Hance, Jim
- Name: Adams, Terry
- Name: Perham, Tom
- Age: 13 Count at that age: 1
- Name: Penor, Lori
- Age: 14 Count at that age: 1
- Name: Abolrous, Hazen
- sumByNullable query operator
- Sum of ages: 84
- minByNullable
- Minimum age: 10
- maxByNullable
- Maximum age: 14
- averageBy
- Average student ID: 4.500000
- averageByNullable
- Average age: 12
- find query operator
- Found a match with StudentID = 1
- all query operator
- Do all students have a comma in the name? true
- head query operator
- Found the head student with StudentID = 1
- nth query operator
- Third number is 11
- skip query operator
- StudentID = 2
- StudentID = 3
- StudentID = 4
- StudentID = 5
- StudentID = 6
- StudentID = 7
- StudentID = 8
- skipWhile query operator
- Number = 5
- Number = 7
- Number = 11
- Number = 18
- Number = 21
- sumBy query operator
- Sum of student IDs: 36
- take query operator
- StudentID = 1
- StudentID = 2
- takeWhile query operator
- Number = 1
- Number = 5
- Number = 7
- sortByNullable query operator
- StudentID, Name, Age: 8 Peng, Yun-Feng NULL
- StudentID, Name, Age: 1 Abercrombie, Kim 10
- StudentID, Name, Age: 5 Hansen, Claus 11
- StudentID, Name, Age: 7 Perham, Tom 12
- StudentID, Name, Age: 3 Hance, Jim 12
- StudentID, Name, Age: 4 Adams, Terry 12
- StudentID, Name, Age: 6 Penor, Lori 13
- StudentID, Name, Age: 2 Abolrous, Hazen 14
- sortByNullableDescending query operator
- StudentID, Name, Age: 2 Abolrous, Hazen 14
- StudentID, Name, Age: 6 Penor, Lori 13
- StudentID, Name, Age: 7 Perham, Tom 12
- StudentID, Name, Age: 3 Hance, Jim 12
- StudentID, Name, Age: 4 Adams, Terry 12
- StudentID, Name, Age: 5 Hansen, Claus 11
- StudentID, Name, Age: 1 Abercrombie, Kim 10
- StudentID, Name, Age: 8 Peng, Yun-Feng NULL
- thenByNullable query operator
- StudentID, Name, Age: 1 Abercrombie, Kim 10
- StudentID, Name, Age: 2 Abolrous, Hazen 14
- StudentID, Name, Age: 4 Adams, Terry 12
- StudentID, Name, Age: 3 Hance, Jim 12
- StudentID, Name, Age: 5 Hansen, Claus 11
- StudentID, Name, Age: 8 Peng, Yun-Feng NULL
- StudentID, Name, Age: 6 Penor, Lori 13
- StudentID, Name, Age: 7 Perham, Tom 12
- thenByNullableDescending query operator
- StudentID, Name, Age: 1 Abercrombie, Kim 10
- StudentID, Name, Age: 2 Abolrous, Hazen 14
- StudentID, Name, Age: 4 Adams, Terry 12
- StudentID, Name, Age: 3 Hance, Jim 12
- StudentID, Name, Age: 5 Hansen, Claus 11
- StudentID, Name, Age: 8 Peng, Yun-Feng NULL
- StudentID, Name, Age: 6 Penor, Lori 13
- StudentID, Name, Age: 7 Perham, Tom 12
- All students:
- Abercrombie, Kim 1 10
- Abolrous, Hazen 2 14
- Hance, Jim 3 12
- Adams, Terry 4 12
- Hansen, Claus 5 11
- Penor, Lori 6 13
- Perham, Tom 7 12
- Peng, Yun-Feng 8 NULL
- Count of students:
- Student count: 8
- Exists.
- " Abercrombie, Kim"
- "Abolrous, Hazen"
- "Hance, Jim"
- "Adams, Terry"
- "Hansen, Claus"
- "Perham, Tom"
- Group by age and count
- NULL 1
- 10 1
- 11 1
- 12 3
- 13 1
- 14 1
- Group value by age. NULL 1
- 10 1
- 11 1
- 12 3
- 13 1
- 14 1
- Group students by age where age > 10. Age: 11
- Hansen, Claus
- Age: 12
- Hance, Jim
- Adams, Terry
- Perham, Tom
- Age: 13
- Penor, Lori
- Age: 14
- Abolrous, Hazen
- Group students by age and print counts of number of students at each age with more than 1 student. Age: 12 Count: 3
- Group students by age and sum ages. Age: 0
- Count: 1
- Total years:
- Age: 10
- Count: 1
- Total years: 10
- Age: 11
- Count: 1
- Total years: 11
- Age: 12
- Count: 3
- Total years: 36
- Age: 13
- Count: 1
- Total years: 13
- Age: 14
- Count: 1
- Total years: 14
- Group students by age and count number of students at each age, and display all with count > 1 in descending order of count. Age: 12
- Count: 3
- Select students from a set of IDs
- Name: Abercrombie, Kim
- Name: Abolrous, Hazen
- Name: Hansen, Claus
- Look for students with Name match _e% pattern and take first two. Penor, Lori
- Perham, Tom
- Look for students with Name matching [abc]% pattern. Abercrombie, Kim
- Abolrous, Hazen
- Adams, Terry
- Look for students with name matching [^abc]% pattern. Hance, Jim
- Hansen, Claus
- Penor, Lori
- Perham, Tom
- Peng, Yun-Feng
- Look for students with name matching [^abc]% pattern and select ID. 3
- 5
- 6
- 7
- 8
- Using Contains as a query filter. Abercrombie, Kim
- Abolrous, Hazen
- Hance, Jim
- Adams, Terry
- Hansen, Claus
- Perham, Tom
- Searching for names from a list. Join Student and CourseSelection tables. 2 Abolrous, Hazen 2
- 3 Hance, Jim 3
- 5 Hansen, Claus 5
- 2 Abolrous, Hazen 2
- 5 Hansen, Claus 5
- 6 Penor, Lori 6
- 3 Hance, Jim 3
- 2 Abolrous, Hazen 2
- 1 Abercrombie, Kim 1
- 2 Abolrous, Hazen 2
- 5 Hansen, Claus 5
- 2 Abolrous, Hazen 2
- 3 Hance, Jim 3
- 2 Abolrous, Hazen 2
- 3 Hance, Jim 3
- Left Join Student and CourseSelection tables. 1 Abercrombie, Kim 10 9 3 1
- 2 Abolrous, Hazen 14 1 1 2
- 2 Abolrous, Hazen 14 4 2 2
- 2 Abolrous, Hazen 14 8 3 2
- 2 Abolrous, Hazen 14 10 4 2
- 2 Abolrous, Hazen 14 12 4 2
- 2 Abolrous, Hazen 14 14 5 2
- 3 Hance, Jim 12 2 1 3
- 3 Hance, Jim 12 7 2 3
- 3 Hance, Jim 12 13 5 3
- 3 Hance, Jim 12 15 7 3
- 4 Adams, Terry 12 NULL NULL NULL
- 5 Hansen, Claus 11 3 1 5
- 5 Hansen, Claus 11 5 2 5
- 5 Hansen, Claus 11 11 4 5
- 6 Penor, Lori 13 6 2 6
- 7 Perham, Tom 12 NULL NULL NULL
- 8 Peng, Yun-Feng 0 NULL NULL NULL
- Join with count
- 15
- Join with distinct. Abercrombie, Kim 2
- Abercrombie, Kim 3
- Abercrombie, Kim 5
- Abolrous, Hazen 2
- Abolrous, Hazen 5
- Abolrous, Hazen 6
- Abolrous, Hazen 3
- Hance, Jim 2
- Hance, Jim 1
- Adams, Terry 2
- Adams, Terry 5
- Adams, Terry 2
- Hansen, Claus 3
- Hansen, Claus 2
- Perham, Tom 3
- Join with distinct and count. 15
- Selecting students with age between 10 and 15. Abercrombie, Kim
- Abolrous, Hazen
- Hance, Jim
- Adams, Terry
- Hansen, Claus
- Penor, Lori
- Perham, Tom
- Selecting students with age either 11 or 12. Hance, Jim
- Adams, Terry
- Hansen, Claus
- Perham, Tom
- Selecting students in a certain age range and sorting. Penor, Lori 13
- Perham, Tom 12
- Hance, Jim 12
- Adams, Terry 12
- Selecting students with certain ages, taking account of possibility of nulls. Hance, Jim
- Adams, Terry
- Union of two queries. Abercrombie, Kim 10
- Abolrous, Hazen 14
- Hance, Jim 12
- Adams, Terry 12
- Hansen, Claus 11
- Penor, Lori 13
- Perham, Tom 12
- Peng, Yun-Feng NULL
- Intersect of two queries. Using if statement to alter results for special value. 1 10 10
- 2 14 14
- 3 12 12
- 4 12 12
- 5 11 11
- 6 13 13
- 7 12 12
- 8 NULL NULL
- Using if statement to alter results special values. 1 10 10
- 2 14 14
- 3 12 12
- 4 12 12
- 5 11 11
- 6 13 13
- 7 12 12
- 8 NULL NULL
- Multiple table select. StudentID Name Age CourseID CourseName
- 1 Abercrombie, Kim 10 1 Algebra I
- 2 Abolrous, Hazen 14 1 Algebra I
- 3 Hance, Jim 12 1 Algebra I
- 4 Adams, Terry 12 1 Algebra I
- 5 Hansen, Claus 11 1 Algebra I
- 6 Penor, Lori 13 1 Algebra I
- 7 Perham, Tom 12 1 Algebra I
- 8 Peng, Yun-Feng NULL 1 Algebra I
- 1 Abercrombie, Kim 10 2 Trigonometry
- 2 Abolrous, Hazen 14 2 Trigonometry
- 3 Hance, Jim 12 2 Trigonometry
- 4 Adams, Terry 12 2 Trigonometry
- 5 Hansen, Claus 11 2 Trigonometry
- 6 Penor, Lori 13 2 Trigonometry
- 7 Perham, Tom 12 2 Trigonometry
- 8 Peng, Yun-Feng NULL 2 Trigonometry
- 1 Abercrombie, Kim 10 3 Algebra II
- 2 Abolrous, Hazen 14 3 Algebra II
- 3 Hance, Jim 12 3 Algebra II
- 4 Adams, Terry 12 3 Algebra II
- 5 Hansen, Claus 11 3 Algebra II
- 6 Penor, Lori 13 3 Algebra II
- 7 Perham, Tom 12 3 Algebra II
- 8 Peng, Yun-Feng NULL 3 Algebra II
- 1 Abercrombie, Kim 10 4 History
- 2 Abolrous, Hazen 14 4 History
- 3 Hance, Jim 12 4 History
- 4 Adams, Terry 12 4 History
- 5 Hansen, Claus 11 4 History
- 6 Penor, Lori 13 4 History
- 7 Perham, Tom 12 4 History
- 8 Peng, Yun-Feng NULL 4 History
- 1 Abercrombie, Kim 10 5 English
- 2 Abolrous, Hazen 14 5 English
- 3 Hance, Jim 12 5 English
- 4 Adams, Terry 12 5 English
- 5 Hansen, Claus 11 5 English
- 6 Penor, Lori 13 5 English
- 7 Perham, Tom 12 5 English
- 8 Peng, Yun-Feng NULL 5 English
- 1 Abercrombie, Kim 10 6 French
- 2 Abolrous, Hazen 14 6 French
- 3 Hance, Jim 12 6 French
- 4 Adams, Terry 12 6 French
- 5 Hansen, Claus 11 6 French
- 6 Penor, Lori 13 6 French
- 7 Perham, Tom 12 6 French
- 8 Peng, Yun-Feng NULL 6 French
- 1 Abercrombie, Kim 10 7 Chinese
- 2 Abolrous, Hazen 14 7 Chinese
- 3 Hance, Jim 12 7 Chinese
- 4 Adams, Terry 12 7 Chinese
- 5 Hansen, Claus 11 7 Chinese
- 6 Penor, Lori 13 7 Chinese
- 7 Perham, Tom 12 7 Chinese
- 8 Peng, Yun-Feng NULL 7 Chinese
- Multiple Joins
- Abercrombie, Kim Trigonometry
- Abercrombie, Kim Algebra II
- Abercrombie, Kim English
- Abolrous, Hazen Trigonometry
- Abolrous, Hazen English
- Abolrous, Hazen French
- Abolrous, Hazen Algebra II
- Hance, Jim Trigonometry
- Hance, Jim Algebra I
- Adams, Terry Trigonometry
- Adams, Terry English
- Adams, Terry Trigonometry
- Hansen, Claus Algebra II
- Hansen, Claus Trigonometry
- Perham, Tom Algebra II
- Multiple Left Outer Joins
- Abercrombie, Kim Trigonometry
- Abercrombie, Kim Algebra II
- Abercrombie, Kim English
- Abolrous, Hazen Trigonometry
- Abolrous, Hazen English
- Abolrous, Hazen French
- Abolrous, Hazen Algebra II
- Hance, Jim Trigonometry
- Hance, Jim Algebra I
- Adams, Terry Trigonometry
- Adams, Terry English
- Adams, Terry Trigonometry
- Hansen, Claus Algebra II
- Hansen, Claus Trigonometry
- Penor, Lori
- Perham, Tom Algebra II
- Peng, Yun-Feng
- type schema
- val db : schema.ServiceTypes.SimpleDataContextTypes.MyDatabase1
- val student : System.Data.Linq.Table<schema.ServiceTypes.Student>
- val data : int list = [1; 5; 7; 11; 18; 21]
- type Nullable<'T
- when 'T : (new : unit -> 'T) and 'T : struct and
- 'T :> System.ValueType> with
- member Print : unit -> string
- val num : int = 21
- val student2 : schema.ServiceTypes.Student
- val student3 : schema.ServiceTypes.Student
- val student4 : schema.ServiceTypes.Student
- val student5 : int = 1
- val student6 : int = 8
- val idList : int list = [1; 2; 5; 10]
- val idQuery : seq<int>
- val names : string [] = [|"a"; "b"; "c"|]
- module Queries = begin
- val query1 : System.Linq.IQueryable<string * System.Nullable<int>>
- val query2 : System.Linq.IQueryable<string * System.Nullable<int>>
- end
- module Queries2 = begin
- val query1 : System.Linq.IQueryable<string * System.Nullable<int>>
- val query2 : System.Linq.IQueryable<string * System.Nullable<int>>
- end
[转]查询表达式 (F#)的更多相关文章
- C# 标准查询表达式
一.标准查询运算符 1.C#提供了标准查询运算符,例如我想选择专利一系列(pantents)中以年份19开头的专利,可以用如下语句: IEnumerable<Patent> pantent ...
- Linq之查询表达式语法详解
1.闲言碎语 由于项目的需要接触到Linq,刚开始有些不适应,好多概念都很模糊.不过经过一段时间的摸索,慢慢地对Linq有了一个更加深入的了解.在此记录一下备忘. 2.查询表达式语法 执行L ...
- 《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符
(1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量. 透明标识符只在翻译过程中存在,翻译结束将不再出现. (2)翻译步骤 ①带有into连续语句的Select和Group语句 from. ...
- Nhibernate系列学习之(三) Criteria查询表达式增删改查
Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...
- LINQ查询表达式详解(2)——查询表达式的转换
简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...
- 如何使用 Entity Framework 构造动态查询表达式
一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...
- Linq查询表达式
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...
- 《C#本质论》读书笔记(15)使用查询表达式的LINQ
15.1 查询表达式的概念 简单的查询表达式 private static void ShowContextualKeywords1() { IEnumerable<string> sel ...
- lambda表达式和查询表达式
(1)Lambda表达式定义: Lambda是创建匿名函数的另一种形式.它比对应的匿名方法更加的简化.因此,所有的情况都推荐使用Lambda表达式. 它可以包括表达式和语句,并且用于创建委托和事件 ...
随机推荐
- 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘
[C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...
- 全栈JavaScript之路(十六)HTML5 HTMLDocument 类型的变化
HTML5 扩展了 HTMLDocument, 添加了新的功能. 1.document.readState = 'loading' || 'complete' //支持readyState 属性的浏 ...
- url加密并计算时间
将URL地址参数进行加密传输提高网站安全性 加密算法,直接调用就好 function keyED($txt,$encrypt_key){ $encrypt_key = md5($encrypt_key ...
- C项目实践--网络协议和套接字编程
1.TCP/IP协议 TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议,ICMP(Internet Control Message Proto ...
- 头文件与cpp文件为什么要分开写
最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以 类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...
- Restrictions.or多个条件用法
两个条件或查询: Restrictions.or(Restrictions.in("username",list1),Restrictions.idEq(1)); 三个或多个条件查 ...
- jfreechart应用1--环境配置
jfreechart应用1--环境配置 JFreeChart是一组功能强大.灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图.饼图.曲线图.甘特图等.它能够用在Swing和We ...
- Newtonsoft.Json.dll 反序列化JSON字符串
上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向 ...
- BZOJ3669(NOI2014):魔法森林 (LCT维护最小生成树)
为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N ...
- 进程、轻量级进程(LWP)、线程
进程.轻量级进程(LWP).线程 进程:程序执行体,有生命期,用来分配资源的实体 线程:分配CPU的实体. 用户空间实现,一个线程阻塞,所有都阻塞. 内核实现,不会所用相关线程都阻塞.用LWP实现,用 ...