本文转自:http://msdn.microsoft.com/zh-cn/library/hh225374.aspx

查询表达式可以查询数据源并将数据是一种预期形式。             查询表达式提供 F# 中支持 LINQ。

 
  1. query { expression }
备注


            

查询表达式是计算表达式的类型类似于序列表达式。               就象通过提供代码指定顺序在序列表达式中,可以在查询表达式指定设置数据通过提供代码。  在序列表达式,yield 关键字标识要返回的数据为产生的序列的一部分。  在查询表达式中,select 关键字执行相同的功能。  除了 select 关键字以外,F# 还支持十分类似于 SQL SELECT 语句的大量查询运算符。  这是一个简单的查询表达式的示例,与连接到 Northwind OData 源的代码。

  1. // Use the OData type provider to create types that can be used to access the Northwind database.
  2. // Add References to FSharp.Data.TypeProviders and System.Data.Services.Client
  3. open Microsoft.FSharp.Data.TypeProviders
  4.  
  5. type Northwind = ODataService<"http://services.odata.org/Northwind/Northwind.svc">
  6. let db = Northwind.GetDataContext()
  7.  
  8. // A query expression.
  9. let query1 = query { for customer in db.Customers do
  10. select customer }
  11.  
  12. query1
  13. |> 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 程序集。  创建此数据库的代码是组成的本主题末尾的。

  1. open System
  2. open Microsoft.FSharp.Data.TypeProviders
  3. open System.Data.Linq.SqlClient
  4. open System.Linq
  5. open Microsoft.FSharp.Linq
  6.  
  7. type schema = SqlDataConnection<"Data Source=SERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">
  8.  
  9. let db = schema.GetDataContext()
  10.  
  11. // Needed for some query operator examples:
  12. let data = [ 1; 5; 7; 11; 18; 21]
表 1。查询运算符

运算符

描述

contains

确定所选元素是否包含一个指定的元素。

  1. let isStudent11 =
  2. query {
  3.     for student in db.Student do
  4.     select student.Age.Value
  5.     contains 11
  6. }

count

返回所选元素的数量。

  1. let countOfStudents =
  2. query {
  3.     for student in db.Student do
  4.     select student
  5.     count
  6. }

last

到目前为止选择选定的表的最后一个元素。

  1. let number =
  2. query {
  3.      for number in data do
  4.      last
  5. }

lastOrDefault

;如果未找到至此,选择选定的表中的最后一个元素或一个默认值元素。

  1. let number =
  2. query {
  3.         for number in data do
  4. where (number < 0)
  5.         lastOrDefault
  6. }

exactlyOne

到目前为止选定的一个,特定元素。  如果多个元素存在,则将引发。

  1. let student =
  2. query {
  3.      for student in db.Student do
  4.      where (student.StudentID = 1)
  5.      select student
  6.      exactlyOne
  7. }

exactlyOneOrDefault

;如果未找到至此,选择选定的表的唯一,特定元素或一个默认值该元素。

  1. let student =
  2. query {
  3.      for student in db.Student do
  4.      where (student.StudentID = 1)
  5.      select student
  6.      exactlyOneOrDefault
  7. }

headOrDefault

如果该序列不包含元素至此,选择选定的表的第一个元素或一个默认值。

  1. let student =
  2. query {
  3.      for student in db.Student do
  4.      select student
  5.      headOrDefault
  6. }

select

到目前为止项目选定的每个元素。

  1. query {
  2.     for student in db.Student do
  3.     select student
  4.     }

where

根据指定谓词的元素。

  1. query {
  2.     for student in db.Student do
  3.     where (student.StudentID > 4)
  4.     select student
  5.     }

minBy

为选定的每个元素到目前为止选择一个值并返回最小的结果值。

  1. let student =
  2.     query {
  3.         for student in db.Student do
  4.         minBy student.StudentID
  5.     }

maxBy

为选定的每个元素到目前为止选择一个值并返回最大结果值。

  1. let student =
  2.     query {
  3.         for student in db.Student do
  4.         maxBy student.StudentID
  5.     }

groupBy

到目前为止组按照指定的键选择器中选择的元素。

  1. query {
  2.     for student in db.Student do
  3.     groupBy student.Age into g
  4.     select (g.Key, g.Count())
  5.     }

sortBy

到目前为止对升序选择组件的特定排序的键。

  1. query {
  2.     for student in db.Student do
  3.     sortBy student.Name
  4.     select student
  5. }

sortByDescending

到目前为止按降序进行选择的元素由特定排序的键。

  1. query {
  2.     for student in db.Student do
  3.     sortByDescending student.Name
  4.     select student
  5. }

thenBy

在升序到目前为止执行特定排序的键选择哪个后续排序元素。  此运算符只能在 sortBy、sortByDescending、thenBy或 thenByDescending之后只使用。

  1. query {
  2.     for student in db.Student do
  3.     where student.Age.HasValue
  4.     sortBy student.Age.Value
  5.     thenBy student.Name
  6.     select student
  7. }

thenByDescending

按降序到目前为止执行特定排序的键选择哪个后续排序元素。  此运算符只能在 sortBy、sortByDescending、thenBy或 thenByDescending之后只使用。

  1. query {
  2.     for student in db.Student do
  3.     where student.Age.HasValue
  4.     sortBy student.Age.Value
  5.     thenByDescending student.Name
  6.     select student
  7. }

groupValBy

为给定键选择和组至此选择一个值元素的每个元素。

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

join

相互关系两个基于匹配的键的设置选定的值。  请注意键的顺序在周围的 = 签名连接表达式是有意义的。  在连接,因此,如果行。-> 符号后拆分,缩进的缩进距离必须至少在关键字 for。

  1. query {
  2.     for student in db.Student do
  3.     join selection in db.CourseSelection on
  4. (student.StudentID = selection.StudentID)
  5.     select (student, selection)
  6. }

groupJoin

相互关系两个基于匹配的键和组的设置选定的值结果。  请注意键的顺序在周围的 = 签名连接表达式是有意义的。

  1. query {
  2.     for student in db.Student do
  3.     groupJoin courseSelection in db.CourseSelection on
  4. (student.StudentID = courseSelection.StudentID) into g
  5.     for courseSelection in g do
  6.     join course in db.Course on (courseSelection.CourseID = course.CourseID)
  7.     select (student.Name, course.CourseName)
  8.     }

leftOuterJoin

相互关系两个基于匹配的键和组的设置选定的值结果。  如果任何组为空,使用一组具有一个默认值。  请注意键的顺序在周围的 = 签名连接表达式是有意义的。

  1. query {
  2.     for student in db.Student do
  3.     leftOuterJoin selection in db.CourseSelection on
  4. (student.StudentID = selection.StudentID) into result
  5.     for selection in result.DefaultIfEmpty() do
  6.     select (student, selection)
  7.     }

sumByNullable

为选定的每个元素到目前为止选择一个可以为 null 的值并返回这些值的总和。  如果有可以为 null,可不具有值,它将被忽略。

  1. query {
  2.     for student in db.Student do
  3.     sumByNullable student.Age
  4. }

minByNullable

为选定的每个元素到目前为止选择一个可以为 null 的值并返回这些值最小位数。  如果有可以为 null,可不具有值,它将被忽略。

  1. query {
  2.     for student in db.Student do
  3.     minByNullable student.Age
  4. }

maxByNullable

为选定的每个元素到目前为止选择一个可以为 null 的值并返回这些值最大次数。  如果有可以为 null,可不具有值,它将被忽略。

  1. query {
  2.     for student in db.Student do
  3.     maxByNullable student.Age
  4.     }

averageByNullable

为选定的每个元素到目前为止选择一个可以为 null 的值并返回平均值这些值。  如果有可以为 null,可不具有值,它将被忽略。

  1. query {
  2.     for student in db.Student do
  3.     averageByNullable (Nullable.float student.Age)
  4.     }

averageBy

为选定的每个元素到目前为止选择一个值并返回平均值这些值。

  1. query {
  2.     for student in db.Student do
  3.     averageBy (float student.StudentID)
  4. }

distinct

到目前为止选择不同的组件从所选元素。

  1. query {
  2.     for student in db.Student do
  3.     join selection in db.CourseSelection on
  4. (student.StudentID = selection.StudentID)
  5.     distinct       
  6. }

exists

确定选定的任何元素到目前为止是否满足条件。

  1. query {
  2.     for student in db.Student do
  3.     where (query { for courseSelection in db.CourseSelection do
  4.                    exists (courseSelection.StudentID = student.StudentID) })
  5.     select student
  6. }

find

选择到目前为止满足指定条件的第一个选定的元素。

  1. query {
  2.     for student in db.Student do
  3.     find (student.Name = "Abercrombie, Kim")
  4. }

all

确定选定的所有元素到目前为止是否满足条件。

  1. query {
  2.     for student in db.Student do
  3.     all (SqlMethods.Like(student.Name, "%,%"))
  4. }

head

到目前为止选择第一个元素从选定的表。

  1. query {
  2.     for student in db.Student do
  3.     head
  4. }

nth

到目前为止选择元素在选定的表中的指定索引。

  1. query {
  2.     for numbers in data do
  3.     nth 3
  4. }

skip

到目前为止跳过所选元素指定数目的然后选择剩余的元素。

  1. query {
  2.     for student in db.Student do
  3.     skip 1
  4. }

skipWhile

在序列中的元素,只要一个指定的条件为 true 的然后选择剩余的元素。

  1. query {
  2.     for number in data do
  3.     skipWhile (number < 3)
  4.     select student
  5.     }

sumBy

为选定的每个元素到目前为止选择一个值并返回这些值的总和。

  1. query {
  2.    for student in db.Student do
  3.    sumBy student.StudentID
  4.    }

take

到目前为止选择连续的指定数量的元素从选定的表。

  1. query {
  2.    for student in db.Student do
  3.    select student
  4.    take 2
  5.    }

takeWhile

选择元素序列,只要一个指定条件为 true,则跳过剩余的元素。

  1. query {
  2.     for number in data do
  3.     takeWhile (number < 10)
  4.     }

sortByNullable

到目前为止对升序选择的元素由特定的排序的键。

  1. query {
  2.     for student in db.Student do
  3.     sortByNullable student.Age
  4.     select student
  5. }

sortByNullableDescending

到目前为止按降序进行选择的元素由特定的排序的键。

  1. query {
  2.     for student in db.Student do
  3.     sortByNullableDescending student.Age
  4.     select student
  5. }

thenByNullable

在升序到目前为止执行特定的排序的键选择哪个后续排序元素。  此运算符只能在 sortBy之后只使用、sortByDescending、thenBy或 thenByDescending,也可以为 null 的变量。

  1. query {
  2.     for student in db.Student do
  3.     sortBy student.Name
  4.     thenByNullable student.Age
  5.     select student
  6. }

thenByNullableDescending

按降序到目前为止执行特定的排序的键选择哪个后续排序元素。  此运算符只能在 sortBy之后只使用、sortByDescending、thenBy或 thenByDescending,也可以为 null 的变量。

  1. query {
  2.     for student in db.Student do
  3.     sortBy student.Name
  4.     thenByNullableDescending student.Age
  5.     select student
  6. }

下表显示了 F# 的一些常见 Transact-SQL 查询与其等效项。               代码此表还假定数据库和上表与同一初始代码相同的设置类型提供程序。

表 2。Transact-SQL 和 F# 查询表达式

Transact-SQL (不区分大小写)

F# 查询表达式 (区分大小写)

选择所有字段从表。

  1. SELECT * FROM Student
  1. // All students.
  2. query {
  3.     for student in db.Student do
  4.     select student
  5. }

计数记录在表中。

  1. SELECT COUNT(*) FROM Student
  1. // Count of students.
  2. query {
  3.     for student in db.Student do       
  4.     count
  5. }

EXISTS

  1. SELECT * FROM Student
  2. WHERE EXISTS
  3. (SELECT * FROM CourseSelection
  4. WHERE CourseSelection.StudentID = Student.StudentID)
  1. // Find students who have signed up at least one course.
  2. query {
  3.     for student in db.Student do
  4.     where (query { for courseSelection in db.CourseSelection do
  5.                    exists (courseSelection.StudentID = student.StudentID) })
  6.     select student
  7. }

分组

  1. SELECT Student.Age, COUNT(*) FROM Student
  2. GROUP BY Student.Age
  1. // Group by age and count.
  2. query {
  3.     for n in db.Student do
  4.     groupBy n.Age into g
  5.     select (g.Key, g.Count())
  6. }
  7. // OR
  8. query {
  9.     for n in db.Student do
  10.     groupValBy n.Age n.Age into g
  11.     select (g.Key, g.Count())
  12. }

分组加上条件。

  1. SELECT Student.Age, COUNT(*)
  2. FROM Student
  3. GROUP BY Student.Age
  4. HAVING student.Age > 10
  1. // Group students by age where age > 10.
  2. query {
  3.     for student in db.Student do
  4.     groupBy student.Age into g
  5.     where (g.Key.HasValue && g.Key.Value > 10)
  6.     select (g.Key, g.Count())
  7. }

分组的计数情况。

  1. SELECT Student.Age, COUNT(*)
  2. FROM Student
  3. GROUP BY Student.Age
  4. HAVING COUNT(*) > 1
  1. // Group students by age and count number of students
  2. // at each age with more than 1 student.
  3. query {
  4.     for student in db.Student do
  5.     groupBy student.Age into group
  6.     where (group.Count() > 1)
  7.     select (group.Key, group.Count())
  8. }

分组,计数、求和与求平均值计算。

  1. SELECT Student.Age, COUNT(*), SUM(Student.Age) as total
  2. FROM Student
  3. GROUP BY Student.Age
  1. // Group students by age and sum ages.
  2. query {
  3.     for student in db.Student do
  4.     groupBy student.Age into g       
  5.     let total = query { for student in g do
  6. sumByNullable student.Age }
  7.     select (g.Key, g.Count(), total)
  8. }

分组,计数和排序由计数。

  1. SELECT Student.Age, COUNT(*) as myCount
  2. FROM Student
  3. GROUP BY Student.Age
  4. HAVING COUNT(*) > 1
  5. ORDER BY COUNT(*) DESC
  1. // Group students by age, count number of students
  2. // at each age, and display all with count > 1
  3. // in descending order of count.
  4. query {
  5.     for student in db.Student do
  6.     groupBy student.Age into g
  7.     where (g.Count() > 1)       
  8.     sortByDescending (g.Count())
  9.     select (g.Key, g.Count())
  10. }

IN     设置指定值

  1. SELECT *
  2. FROM Student
  3. WHERE Student.StudentID IN (1, 2, 5, 10)
  1. // Select students where studentID is one of a given list.
  2. let idQuery = query { for id in [1; 2; 5; 10] do
  3. select id }
  4. query {
  5. for student in db.Student do
  6. where (idQuery.Contains(student.StudentID))
  7. select student
  8. }

LIKE   和 TOP。

  1. -- '_e%' matches strings where the second character is 'e'
  2. SELECT TOP 2 * FROM Student
  3. WHERE Student.Name LIKE '_e%'
  1. // Look for students with Name match _e% pattern and take first two.
  2. query {
  3.     for student in db.Student do
  4.     where (SqlMethods.Like( student.Name, "_e%") )
  5.     select student
  6.     take 2  
  7.     }

与设置的模式匹配LIKE。

  1. -- '[abc]%' matches strings where the first character is
  2. -- 'a', 'b', 'c', 'A', 'B', or 'C'
  3. SELECT * FROM Student
  4. WHERE Student.Name LIKE '[abc]%'
  1. open System.Data.Linq.SqlClient;
  2.  
  3. printfn "\nLook for students with Name matching [abc]%% pattern."
  4. query {
  5.     for student in db.Student do
  6.     where (SqlMethods.Like( student.Name, "[abc]%") )
  7.     select student 
  8.     }

设置了独占模式的LIKE。

  1. -- '[^abc]%' matches strings where the first character is
  2. -- not 'a', 'b', 'c', 'A', 'B', or 'C'
  3. SELECT * FROM Student
  4. WHERE Student.Name LIKE '[^abc]%'
  1. // Look for students with name matching [^abc]%% pattern.
  2. query {
  3.     for student in db.Student do
  4.     where (SqlMethods.Like( student.Name, "[^abc]%") )
  5.     select student 
  6.     }

在一个字段的LIKE,但是,选择一个不同的字段。

  1. SELECT StudentID AS ID FROM Student
  2. WHERE Student.Name LIKE '[^abc]%'
  1. open System.Data.Linq.SqlClient;
  2.  
  3. printfn "\nLook for students with name matching [^abc]%% pattern and select ID."
  4. query {
  5.     for n in db.Student do
  6.     where (SqlMethods.Like( n.Name, "[^abc]%") )
  7.     select n.StudentID   
  8.     }
  9. |> Seq.iter (fun id -> printfn "%d" id)

LIKE   ,将子字符串搜索。

  1. SELECT * FROM Student
  2. WHERE Student.Name like '%A%'
  1. // Using Contains as a query filter.
  2. query {
  3.     for student in db.Student do
  4.     where (student.Name.Contains("a"))
  5.     select student
  6. }

只有两个表的简单 JOIN。

  1. SELECT * FROM Student
  2. JOIN CourseSelection
  3. ON Student.StudentID = CourseSelection.StudentID
  1. // Join Student and CourseSelection tables.
  2. query {
  3.     for student in db.Student do
  4.     join selection in db.CourseSelection on
  5. (student.StudentID = selection.StudentID)
  6.     select (student, selection)
  7. }

只有 两个表的LEFT JOIN。

  1. SELECT * FROM
  2. Student LEFT JOIN CourseSelection
  3. ON Student.StudentID = CourseSelection.StudentID
  1. //Left Join Student and CourseSelection tables.
  2. query {
  3.     for student in db.Student do
  4.     leftOuterJoin selection in db.CourseSelection on
  5. (student.StudentID = selection.StudentID) into result
  6.     for selection in result.DefaultIfEmpty() do
  7.     select (student, selection)
  8.     }

JOIN   和 COUNT

  1. SELECT COUNT(*) FROM
  2. Student JOIN CourseSelection
  3. ON Student.StudentID = CourseSelection.StudentID
  1. // Join with count.
  2. query {
  3.     for n in db.Student do
  4.     join e in db.CourseSelection on
  5. (n.StudentID = e.StudentID)
  6.     count       
  7. }

DISTINCT

  1. SELECT DISTINCT StudentID FROM CourseSelection
  1. // Join with distinct.
  2. query {
  3.     for student in db.Student do
  4.     join selection in db.CourseSelection on
  5. (student.StudentID = selection.StudentID)
  6.     distinct       
  7. }

清单的计数。

  1. SELECT DISTINCT COUNT(StudentID) FROM CourseSelection
  1. // Join with distinct and count.
  2. query {
  3.     for n in db.Student do
  4.     join e in db.CourseSelection on
  5. n.StudentID = e.StudentID)
  6.     distinct
  7.     count      
  8. }

BETWEEN

  1. SELECT * FROM Student
  2. WHERE Student.Age BETWEEN 10 AND 15
  1. // Selecting students with ages between 10 and 15.
  2. query {
  3.     for student in db.Student do
  4.     where (student.Age ?>= 10 && student.Age ?< 15)
  5.     select student
  6. }

OR

  1. SELECT * FROM Student
  2. WHERE Student.Age =11 OR Student.Age = 12
  1. // Selecting students with age that's either 11 or 12.
  2. query {
  3.     for student in db.Student do
  4.     where (student.Age.Value = 11 || student.Age.Value = 12)
  5.     select student
  6. }

与排序的OR

  1. SELECT * FROM Student
  2. WHERE Student.Age =12 OR Student.Age = 13
  3. ORDER BY Student.Age DESC
  1. // Selecting students in a certain age range and sorting.
  2. query {
  3.     for n in db.Student do
  4.     where (n.Age.Value = 12 || n.Age.Value = 13)
  5.     sortByNullableDescending n.Age
  6.     select n
  7. }

TOP   ,OR和排序。

  1. SELECT TOP 2 student.Name FROM Student
  2. WHERE Student.Age = 11 OR Student.Age = 12
  3. ORDER BY Student.Name DESC
  1. // Selecting students with certain ages,
  2. // taking account of the possibility of nulls.
  3. query {
  4.     for student in db.Student do
  5.     where ((student.Age.HasValue && student.Age.Value = 11) ||
  6. (student.Age.HasValue && student.Age.Value = 12))
  7. sortByDescending student.Name
  8.     select student.Name
  9.     take 2
  10.     }

两个查询UNION。

  1. SELECT * FROM Student
  2. UNION
  3. SELECT * FROM lastStudent
  1. // Union of two queries.
  2. module Queries =
  3.     let query1 = query {
  4.             for n in db.Student do
  5.             select (n.Name, n.Age)
  6.         }
  7.  
  8.     let query2 = query {
  9.             for n in db.LastStudent do
  10.             select (n.Name, n.Age)
  11.             }
  12.  
  13.     query2.Union (query1)

两个查询的交集。

  1. SELECT * FROM Student
  2. INTERSECT
  3. SELECT * FROM LastStudent
  1. // Intersect of two queries.
  2. module Queries2 =
  3.     let query1 = query {
  4.            for n in db.Student do
  5.            select (n.Name, n.Age)
  6.         }
  7.  
  8.     let query2 = query {
  9.             for n in db.LastStudent do
  10.             select (n.Name, n.Age)
  11.             }
  12.  
  13.     query1.Intersect(query2)

CASE   情况。

  1. SELECT student.StudentID,
  2. CASE Student.Age
  3. WHEN -1 THEN 100
  4. ELSE Student.Age
  5. END,
  6. Student.Age
  7. from Student
  1. // Using if statement to alter results for special value.
  2. query {
  3.     for student in db.Student do
  4.     select (if student.Age.HasValue && student.Age.Value = -1 then
  5. (student.StudentID, System.Nullable<int>(100), student.Age)
  6. else (student.StudentID, student.Age, student.Age))
  7.     }

多个用例。

  1. SELECT Student.StudentID,
  2. CASE Student.Age
  3. WHEN -1 THEN 100
  4. WHEN 0 THEN 1000
  5. ELSE Student.Age
  6. END,
  7. Student.Age
  8. FROM Student
  1. // Using if statement to alter results for special values.
  2. query {
  3.     for student in db.Student do
  4.     select (if student.Age.HasValue && student.Age.Value = -1 then
  5.              (student.StudentID, System.Nullable<int>(100), student.Age)
  6.             elif student.Age.HasValue && student.Age.Value = 0 then
  7.                (student.StudentID, System.Nullable<int>(1000), student.Age)
  8.             else (student.StudentID, student.Age, student.Age))
  9.     }

多个表。

  1. SELECT * FROM Student, Course
  1. // Multiple table select.
  2. query {
  3.         for student in db.Student do
  4.         for course in db.Course do
  5.         select (student, course)
  6. }

多联接。

  1. SELECT Student.Name, Course.CourseName
  2. FROM Student
  3. JOIN CourseSelection
  4. ON CourseSelection.StudentID = Student.StudentID
  5. JOIN Course
  6. ON Course.CourseID = CourseSelection.CourseID
  1. // Multiple joins.
  2. query {
  3.     for student in db.Student do
  4.     join courseSelection in db.CourseSelection on
  5.         (student.StudentID = courseSelection.StudentID)
  6.     join course in db.Course on
  7.           (courseSelection.CourseID = course.CourseID)
  8.     select (student.Name, course.CourseName)
  9.     }

多个左外部联接。

  1. SELECT Student.Name, Course.CourseName
  2. FROM Student
  3. LEFT OUTER JOIN CourseSelection
  4. ON CourseSelection.StudentID = Student.StudentID
  5. LEFT OUTER JOIN Course
  6. ON Course.CourseID = CourseSelection.CourseID
  1. // Using leftOuterJoin with multiple joins.
  2. query {
  3.     for student in db.Student do
  4.     leftOuterJoin courseSelection in db.CourseSelection on
  5. (student.StudentID = courseSelection.StudentID) into g1
  6.     for courseSelection in g1.DefaultIfEmpty() do
  7.     leftOuterJoin course in db.Course on
  8. (courseSelection.CourseID = course.CourseID) into g2
  9.     for course in g2.DefaultIfEmpty() do
  10.     select (student.Name, course.CourseName)
  11.     }

下面的代码可用于创建这些示例的示例数据库。

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5.  
  6. USE [master];
  7. GO
  8.  
  9. IF EXISTS (SELECT * FROM sys.databases WHERE name = 'MyDatabase')
  10.                 DROP DATABASE MyDatabase;
  11. GO
  12.  
  13. -- Create the MyDatabase database.
  14. CREATE DATABASE MyDatabase COLLATE SQL_Latin1_General_CP1_CI_AS;
  15. GO
  16.  
  17. -- Specify a simple recovery model
  18. -- to keep the log growth to a minimum.
  19. ALTER DATABASE MyDatabase
  20.                 SET RECOVERY SIMPLE;
  21. GO
  22.  
  23. USE MyDatabase;
  24. GO
  25.  
  26. CREATE TABLE [dbo].[Course] (
  27.     [CourseID]   INT           NOT NULL,
  28.     [CourseName] NVARCHAR (50) NOT NULL,
  29.     PRIMARY KEY CLUSTERED ([CourseID] ASC)
  30. );
  31.  
  32. CREATE TABLE [dbo].[Student] (
  33.     [StudentID] INT           NOT NULL,
  34.     [Name]      NVARCHAR (50) NOT NULL,
  35.     [Age]       INT           NULL,
  36.     PRIMARY KEY CLUSTERED ([StudentID] ASC)
  37. );
  38.  
  39. CREATE TABLE [dbo].[CourseSelection] (
  40.     [ID]        INT NOT NULL,
  41.     [StudentID] INT NOT NULL,
  42.     [CourseID]  INT NOT NULL,
  43.     PRIMARY KEY CLUSTERED ([ID] ASC),
  44.     CONSTRAINT [FK_CourseSelection_ToTable] FOREIGN KEY ([StudentID]) REFERENCES [dbo].[Student] ([StudentID]) ON DELETE NO ACTION ON UPDATE NO ACTION,
  45.     CONSTRAINT [FK_CourseSelection_Course_1] FOREIGN KEY ([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) ON DELETE NO ACTION ON UPDATE NO ACTION
  46. );
  47.  
  48. CREATE TABLE [dbo].[LastStudent] (
  49.     [StudentID] INT           NOT NULL,
  50.     [Name]      NVARCHAR (50) NOT NULL,
  51.     [Age]       INT           NULL,
  52.     PRIMARY KEY CLUSTERED ([StudentID] ASC)
  53. );
  54.  
  55. -- Insert data into the tables.
  56. USE MyDatabase
  57. INSERT INTO Course (CourseID, CourseName)
  58. VALUES(1, 'Algebra I');
  59. INSERT INTO Course (CourseID, CourseName)
  60. VALUES(2, 'Trigonometry');
  61. INSERT INTO Course (CourseID, CourseName)
  62. VALUES(3, 'Algebra II');
  63. INSERT INTO Course (CourseID, CourseName)
  64. VALUES(4, 'History');
  65. INSERT INTO Course (CourseID, CourseName)
  66. VALUES(5, 'English');
  67. INSERT INTO Course (CourseID, CourseName)
  68. VALUES(6, 'French');
  69. INSERT INTO Course (CourseID, CourseName)
  70. VALUES(7, 'Chinese');
  71.  
  72. INSERT INTO Student (StudentID, Name, Age)
  73. VALUES(1, 'Abercrombie, Kim', 10);
  74. INSERT INTO Student (StudentID, Name, Age)
  75. VALUES(2, 'Abolrous, Hazen', 14);
  76. INSERT INTO Student (StudentID, Name, Age)
  77. VALUES(3, 'Hance, Jim', 12);
  78. INSERT INTO Student (StudentID, Name, Age)
  79. VALUES(4, 'Adams, Terry', 12);
  80. INSERT INTO Student (StudentID, Name, Age)
  81. VALUES(5, 'Hansen, Claus', 11);
  82. INSERT INTO Student (StudentID, Name, Age)
  83. VALUES(6, 'Penor, Lori', 13);
  84. INSERT INTO Student (StudentID, Name, Age)
  85. VALUES(7, 'Perham, Tom', 12);
  86. INSERT INTO Student (StudentID, Name, Age)
  87. VALUES(8, 'Peng, Yun-Feng', NULL);
  88.  
  89. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  90. VALUES(1, 1, 2);
  91. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  92. VALUES(2, 1, 3);
  93. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  94. VALUES(3, 1, 5);
  95. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  96. VALUES(4, 2, 2);
  97. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  98. VALUES(5, 2, 5);
  99. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  100. VALUES(6, 2, 6);
  101. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  102. VALUES(7, 2, 3);
  103. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  104. VALUES(8, 3, 2);
  105. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  106. VALUES(9, 3, 1);
  107. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  108. VALUES(10, 4, 2);
  109. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  110. VALUES(11, 4, 5);
  111. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  112. VALUES(12, 4, 2);
  113. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  114. VALUES(13, 5, 3);
  115. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  116. VALUES(14, 5, 2);
  117. INSERT INTO CourseSelection (ID, StudentID, CourseID)
  118. VALUES(15, 7, 3);

下面的代码包含显示在本主题的代码示例。

  1. #if INTERACTIVE
  2. #r "FSharp.Data.TypeProviders.dll"
  3. #r "System.Data.dll"
  4. #r "System.Data.Linq.dll"
  5. #endif
  6. open System
  7. open Microsoft.FSharp.Data.TypeProviders
  8. open System.Data.Linq.SqlClient
  9. open System.Linq
  10.  
  11. [<Generate>]
  12. type schema = SqlDataConnection<"Data Source=SERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">
  13.  
  14. let db = schema.GetDataContext()
  15.  
  16. let student = db.Student
  17.  
  18. let data = [1; 5; 7; 11; 18; 21]
  19.  
  20. open System
  21. type Nullable<'T when 'T : ( new : unit -> 'T) and 'T : struct and 'T :> ValueType > with
  22.     member this.Print() =
  23.         if (this.HasValue) then this.Value.ToString()
  24.         else "NULL"
  25.  
  26. printfn "\ncontains query operator"
  27. query {
  28.     for student in db.Student do
  29.     select student.Age.Value
  30.     contains 11
  31.     }
  32. |> printfn "Is at least one student age 11? %b"
  33.  
  34. printfn "\ncount query operator"
  35. query {
  36.     for student in db.Student do
  37.     select student
  38.     count
  39.     }
  40. |> printfn "Number of students: %d"
  41.  
  42. printfn "\nlast query operator."
  43. let num =
  44.     query {
  45.         for number in data do
  46.         sortBy number
  47.         last
  48.         }
  49. printfn "Last number: %d" num
  50.  
  51. open Microsoft.FSharp.Linq
  52.  
  53. printfn "\nlastOrDefault query operator."
  54. query {
  55.         for number in data do
  56.         sortBy number
  57.         lastOrDefault
  58.         }
  59. |> printfn "lastOrDefault: %d"
  60.  
  61. printfn "\nexactlyOne query operator."
  62. let student2 =
  63.     query {
  64.         for student in db.Student do
  65.         where (student.StudentID = 1)
  66.         select student
  67.         exactlyOne
  68.         }
  69. printfn "Student with StudentID = 1 is %s" student2.Name
  70.  
  71. printfn "\nexactlyOneOrDefault query operator."
  72. let student3 =
  73.     query {
  74.         for student in db.Student do
  75.         where (student.StudentID = 1)
  76.         select student
  77.         exactlyOneOrDefault
  78.         }
  79. printfn "Student with StudentID = 1 is %s" student3.Name
  80.  
  81. printfn "\nheadOrDefault query operator."
  82. let student4 =
  83.     query {
  84.         for student in db.Student do
  85.         select student
  86.         headOrDefault
  87.         }
  88. printfn "head student is %s" student4.Name
  89.  
  90. printfn "\nselect query operator."
  91. query {
  92.     for student in db.Student do
  93.     select student
  94.     }
  95. |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
  96.  
  97. printfn "\nwhere query operator."
  98. query {
  99.     for student in db.Student do
  100.     where (student.StudentID > 4)
  101.     select student
  102.     }
  103. |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
  104.  
  105. printfn "\nminBy query operator."
  106. let student5 =
  107.     query {
  108.         for student in db.Student do
  109.         minBy student.StudentID
  110.     }
  111.  
  112. printfn "\nmaxBy query operator."
  113. let student6 =
  114.     query {
  115.         for student in db.Student do
  116.         maxBy student.StudentID
  117.     }
  118.  
  119. printfn "\ngroupBy query operator."
  120. query {
  121.     for student in db.Student do
  122.     groupBy student.Age into g
  123.     select (g.Key, g.Count())
  124.     }
  125. |> Seq.iter (fun (age, count) -> printfn "Age: %s Count at that age: %d" (age.Print()) count)
  126.  
  127. printfn "\nsortBy query operator."
  128. query {
  129.     for student in db.Student do
  130.     sortBy student.Name
  131.     select student
  132. }
  133. |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
  134.  
  135. printfn "\nsortByDescending query operator."
  136. query {
  137.     for student in db.Student do
  138.     sortByDescending student.Name
  139.     select student
  140. }
  141. |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
  142.  
  143. printfn "\nthenBy query operator."
  144. query {
  145.     for student in db.Student do
  146.     where student.Age.HasValue
  147.     sortBy student.Age.Value
  148.     thenBy student.Name
  149.     select student
  150. }
  151. |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.Age.Value student.Name)
  152.  
  153. printfn "\nthenByDescending query operator."
  154. query {
  155.     for student in db.Student do
  156.     where student.Age.HasValue
  157.     sortBy student.Age.Value
  158.     thenByDescending student.Name
  159.     select student
  160. }
  161. |> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.Age.Value student.Name)
  162.  
  163. printfn "\ngroupValBy query operator."
  164. query {
  165.     for student in db.Student do
  166.     groupValBy student.Name student.Age into g
  167.     select (g, g.Key, g.Count())
  168.     }
  169. |> Seq.iter (fun (group, age, count) ->
  170.     printfn "Age: %s Count at that age: %d" (age.Print()) count
  171.     group |> Seq.iter (fun name -> printfn "Name: %s" name))
  172.  
  173. printfn "\n sumByNullable query operator"
  174. query {
  175.     for student in db.Student do
  176.     sumByNullable student.Age
  177.     }
  178. |> (fun sum -> printfn "Sum of ages: %s" (sum.Print()))
  179.  
  180. printfn "\n minByNullable"
  181. query {
  182.     for student in db.Student do
  183.     minByNullable student.Age
  184.     }
  185. |> (fun age -> printfn "Minimum age: %s" (age.Print()))
  186.  
  187. printfn "\n maxByNullable"
  188. query {
  189.     for student in db.Student do
  190.     maxByNullable student.Age
  191.     }
  192. |> (fun age -> printfn "Maximum age: %s" (age.Print()))
  193.  
  194. printfn "\n averageBy"
  195. query {
  196.     for student in db.Student do
  197.     averageBy (float student.StudentID)
  198.     }
  199. |> printfn "Average student ID: %f"
  200.  
  201. printfn "\n averageByNullable"
  202. query {
  203.     for student in db.Student do
  204.     averageByNullable (Nullable.float student.Age)
  205.     }
  206. |> (fun avg -> printfn "Average age: %s" (avg.Print()))
  207.  
  208. printfn "\n find query operator"
  209. query {
  210.     for student in db.Student do
  211.     find (student.Name = "Abercrombie, Kim")
  212. }
  213. |> (fun student -> printfn "Found a match with StudentID = %d" student.StudentID)
  214.  
  215. printfn "\n all query operator"
  216. query {
  217.     for student in db.Student do
  218.     all (SqlMethods.Like(student.Name, "%,%"))
  219. }
  220. |> printfn "Do all students have a comma in the name? %b"
  221.  
  222. printfn "\n head query operator"
  223. query {
  224.     for student in db.Student do
  225.     head
  226.     }
  227. |> (fun student -> printfn "Found the head student with StudentID = %d" student.StudentID)
  228.  
  229. printfn "\n nth query operator"
  230. query {
  231.     for numbers in data do
  232.     nth 3
  233.     }
  234. |> printfn "Third number is %d"
  235.  
  236. printfn "\n skip query operator"
  237. query {
  238.     for student in db.Student do
  239.     skip 1
  240.     }
  241. |> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
  242.  
  243. printfn "\n skipWhile query operator"
  244. query {
  245.     for number in data do
  246.     skipWhile (number < 3)
  247.     select number
  248.     }
  249. |> Seq.iter (fun number -> printfn "Number = %d" number)
  250.  
  251. printfn "\n sumBy query operator"
  252. query {
  253.    for student in db.Student do
  254.    sumBy student.StudentID
  255.    }
  256. |> printfn "Sum of student IDs: %d"
  257.  
  258. printfn "\n take query operator"
  259. query {
  260.    for student in db.Student do
  261.    select student
  262.    take 2
  263.    }
  264. |> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
  265.  
  266. printfn "\n takeWhile query operator"
  267. query {
  268.     for number in data do
  269.     takeWhile (number < 10)
  270.     }
  271. |> Seq.iter (fun number -> printfn "Number = %d" number)
  272.  
  273. printfn "\n sortByNullable query operator"
  274. query {
  275.     for student in db.Student do
  276.     sortByNullable student.Age
  277.     select student
  278. }
  279. |> Seq.iter (fun student ->
  280.     printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
  281.  
  282. printfn "\n sortByNullableDescending query operator"
  283. query {
  284.     for student in db.Student do
  285.     sortByNullableDescending student.Age
  286.     select student
  287. }
  288. |> Seq.iter (fun student ->
  289.     printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
  290.  
  291. printfn "\n thenByNullable query operator"
  292. query {
  293.     for student in db.Student do
  294.     sortBy student.Name
  295.     thenByNullable student.Age
  296.     select student
  297. }
  298. |> Seq.iter (fun student ->
  299.     printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
  300.  
  301. printfn "\n thenByNullableDescending query operator"
  302. query {
  303.     for student in db.Student do
  304.     sortBy student.Name
  305.     thenByNullableDescending student.Age
  306.     select student
  307. }
  308. |> Seq.iter (fun student ->
  309.     printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
  310.  
  311. printfn "All students: "
  312. query {
  313.         for student in db.Student do
  314.         select student
  315.     }
  316.     |> Seq.iter (fun student -> printfn "%s %d %s" student.Name student.StudentID (student.Age.Print()))
  317.  
  318. printfn "\nCount of students: "
  319. query {
  320.         for student in db.Student do       
  321.         count
  322.     }
  323. |>  (fun count -> printfn "Student count: %d" count)
  324.  
  325. printfn "\nExists."
  326. query {
  327.         for student in db.Student do
  328.         where (query { for courseSelection in db.CourseSelection do
  329.                        exists (courseSelection.StudentID = student.StudentID) })
  330.         select student }
  331. |> Seq.iter (fun student -> printfn "%A" student.Name)
  332.  
  333. printfn "\n Group by age and count"
  334. query {
  335.         for n in db.Student do
  336.         groupBy n.Age into g
  337.         select (g.Key, g.Count())
  338. }
  339. |> Seq.iter (fun (age, count) -> printfn "%s %d" (age.Print()) count)
  340.  
  341. printfn "\n Group value by age."
  342. query {
  343.         for n in db.Student do
  344.         groupValBy n.Age n.Age into g
  345.         select (g.Key, g.Count())
  346.     }
  347. |> Seq.iter (fun (age, count) -> printfn "%s %d" (age.Print()) count)
  348.  
  349. printfn "\nGroup students by age where age > 10."
  350. query {
  351.         for student in db.Student do
  352.         groupBy student.Age into g
  353.        where (g.Key.HasValue && g.Key.Value > 10)
  354.         select (g, g.Key)
  355. }
  356. |> Seq.iter (fun (students, age) ->
  357.     printfn "Age: %s" (age.Value.ToString())
  358.     students
  359.     |> Seq.iter (fun student -> printfn "%s" student.Name))
  360.  
  361. printfn "\nGroup students by age and print counts of number of students at each age with more than 1 student."
  362. query {
  363.         for student in db.Student do
  364.         groupBy student.Age into group
  365.         where (group.Count() > 1)
  366.         select (group.Key, group.Count())
  367. }
  368. |> Seq.iter (fun (age, ageCount) ->
  369.      printfn "Age: %s Count: %d" (age.Print()) ageCount)
  370.  
  371. printfn "\nGroup students by age and sum ages."
  372. query {
  373.         for student in db.Student do
  374.         groupBy student.Age into g       
  375.         let total = query { for student in g do sumByNullable student.Age }
  376.         select (g.Key, g.Count(), total)
  377. }
  378. |> Seq.iter (fun (age, count, total) ->
  379.     printfn "Age: %d" (age.GetValueOrDefault())
  380.     printfn "Count: %d" count
  381.     printfn "Total years: %s" (total.ToString()))
  382.  
  383. printfn "\nGroup students by age and count number of students at each age, and display all with count > 1 in descending order of count."
  384. query {
  385.         for student in db.Student do
  386.         groupBy student.Age into g
  387.         where (g.Count() > 1)       
  388.         sortByDescending (g.Count())
  389.         select (g.Key, g.Count())
  390. }
  391. |> Seq.iter (fun (age, myCount) ->
  392.     printfn "Age: %s" (age.Print())
  393.     printfn "Count: %d" myCount)
  394.  
  395. printfn "\n Select students from a set of IDs"
  396. let idList = [1; 2; 5; 10]
  397. let idQuery = query { for id in idList do
  398.                       select id }
  399. query {
  400.         for student in db.Student do
  401.         where (idQuery.Contains(student.StudentID))
  402.         select student
  403.         }
  404. |> Seq.iter (fun student ->
  405.     printfn "Name: %s" student.Name)
  406.  
  407. printfn "\nLook for students with Name match _e%% pattern and take first two."
  408. query {
  409.     for student in db.Student do
  410.     where (SqlMethods.Like( student.Name, "_e%") )
  411.     select student
  412.     take 2  
  413.     }
  414. |> Seq.iter (fun student -> printfn "%s" student.Name)
  415.  
  416. printfn "\nLook for students with Name matching [abc]%% pattern."
  417. query {
  418.     for student in db.Student do
  419.     where (SqlMethods.Like( student.Name, "[abc]%") )
  420.     select student 
  421.     }
  422. |> Seq.iter (fun student -> printfn "%s" student.Name)
  423.  
  424. printfn "\nLook for students with name matching [^abc]%% pattern."
  425. query {
  426.     for student in db.Student do
  427.     where (SqlMethods.Like( student.Name, "[^abc]%") )
  428.     select student 
  429.     }
  430. |> Seq.iter (fun student -> printfn "%s" student.Name)
  431.  
  432. printfn "\nLook for students with name matching [^abc]%% pattern and select ID."
  433. query {
  434.     for n in db.Student do
  435.     where (SqlMethods.Like( n.Name, "[^abc]%") )
  436.     select n.StudentID   
  437.     }
  438. |> Seq.iter (fun id -> printfn "%d" id)
  439.  
  440. printfn "\n Using Contains as a query filter."
  441. query {
  442.         for student in db.Student do
  443.         where (student.Name.Contains("a"))
  444.         select student
  445.     }
  446. |> Seq.iter (fun student -> printfn "%s" student.Name)
  447.  
  448. printfn "\nSearching for names from a list."
  449. let names = [|"a";"b";"c"|]
  450. query {
  451.     for student in db.Student do
  452.     if names.Contains (student.Name) then select student }
  453. |> Seq.iter (fun student -> printfn "%s" student.Name)
  454.  
  455. printfn "\nJoin Student and CourseSelection tables."
  456. query {
  457.         for student in db.Student do
  458.         join (for selection in db.CourseSelection ->
  459.               student.StudentID = selection.StudentID)
  460.         select (student, selection)
  461.     }
  462. |> Seq.iter (fun (student, selection) -> printfn "%d %s %d" student.StudentID student.Name selection.CourseID)
  463.  
  464. printfn "\nLeft Join Student and CourseSelection tables."
  465. query {
  466.     for student in db.Student do
  467.     leftOuterJoin (for selection in db.CourseSelection ->
  468.                    student.StudentID = selection.StudentID) into result
  469.     for selection in result.DefaultIfEmpty() do
  470.     select (student, selection)
  471.     }
  472. |> Seq.iter (fun (student, selection) ->
  473.     let selectionID, studentID, courseID =
  474.         match selection with
  475.         | null -> "NULL", "NULL", "NULL"
  476.         | sel -> (sel.ID.ToString(), sel.StudentID.ToString(), sel.CourseID.ToString())
  477.     printfn "%d %s %d %s %s %s" student.StudentID student.Name (student.Age.GetValueOrDefault()) selectionID studentID courseID)
  478.  
  479. printfn "\nJoin with count"
  480. query {
  481.         for n in db.Student do
  482.         join (for e in db.CourseSelection -> n.StudentID = e.StudentID)
  483.         count       
  484.     }
  485. |>  printfn "%d"
  486.  
  487. printfn "\n Join with distinct."
  488. query {
  489.         for student in db.Student do
  490.         join (for selection in db.CourseSelection ->
  491.               student.StudentID = selection.StudentID)
  492.         distinct       
  493.     }
  494. |> Seq.iter (fun (student, selection) -> printfn "%s %d" student.Name selection.CourseID)
  495.  
  496. printfn "\n Join with distinct and count."
  497. query {
  498.         for n in db.Student do
  499.         join (for e in db.CourseSelection -> n.StudentID = e.StudentID)
  500.         distinct
  501.         count      
  502.     }
  503. |> printfn "%d"
  504.  
  505. printfn "\n Selecting students with age between 10 and 15."
  506. query {
  507.         for student in db.Student do
  508.         where (student.Age.Value >= 10 && student.Age.Value < 15)
  509.         select student
  510.     }
  511. |> Seq.iter (fun student -> printfn "%s" student.Name)
  512.  
  513. printfn "\n Selecting students with age either 11 or 12."
  514. query {
  515.         for student in db.Student do
  516.         where (student.Age.Value = 11 || student.Age.Value = 12)
  517.         select student
  518.     }
  519. |> Seq.iter (fun student -> printfn "%s" student.Name)
  520.  
  521. printfn "\n Selecting students in a certain age range and sorting."
  522. query {
  523.         for n in db.Student do
  524.         where (n.Age.Value = 12 || n.Age.Value = 13)
  525.         sortByNullableDescending n.Age
  526.         select n
  527.     }
  528. |> Seq.iter (fun student -> printfn "%s %s" student.Name (student.Age.Print()))
  529.  
  530. printfn "\n Selecting students with certain ages, taking account of possibility of nulls."
  531. query {
  532.         for student in db.Student do
  533.         where ((student.Age.HasValue && student.Age.Value = 11) ||
  534.                (student.Age.HasValue && student.Age.Value = 12))
  535.         sortByDescending student.Name
  536. select student.Name
  537.         take 2
  538.     }
  539. |> Seq.iter (fun name -> printfn "%s" name)
  540.  
  541. printfn "\n Union of two queries."
  542. module Queries =
  543.     let query1 = query {
  544.             for n in db.Student do
  545.             select (n.Name, n.Age)
  546.         }
  547.  
  548.     let query2 = query {
  549.             for n in db.LastStudent do
  550.             select (n.Name, n.Age)
  551.             }
  552.  
  553.     query2.Union (query1)
  554.     |> Seq.iter (fun (name, age) -> printfn "%s %s" name (age.Print()))
  555.  
  556. printfn "\n Intersect of two queries."
  557. module Queries2 =
  558.     let query1 = query {
  559.            for n in db.Student do
  560.            select (n.Name, n.Age)
  561.         }
  562.  
  563.     let query2 = query {
  564.             for n in db.LastStudent do
  565.             select (n.Name, n.Age)
  566.             }
  567.  
  568.     query1.Intersect(query2)
  569.     |> Seq.iter (fun (name, age) -> printfn "%s %s" name (age.Print()))
  570.  
  571. printfn "\n Using if statement to alter results for special value."
  572. query {
  573.         for student in db.Student do
  574.         select (if student.Age.HasValue && student.Age.Value = -1 then
  575.                    (student.StudentID, System.Nullable<int>(100), student.Age)
  576.                 else (student.StudentID, student.Age, student.Age))
  577.     }
  578. |> Seq.iter (fun (id, value, age) -> printfn "%d %s %s" id (value.Print()) (age.Print()))
  579.  
  580. printfn "\n Using if statement to alter results special values."
  581. query {
  582.         for student in db.Student do
  583.         select (if student.Age.HasValue && student.Age.Value = -1 then
  584.                    (student.StudentID, System.Nullable<int>(100), student.Age)
  585.                 elif student.Age.HasValue && student.Age.Value = 0 then
  586.                     (student.StudentID, System.Nullable<int>(100), student.Age)
  587.                 else (student.StudentID, student.Age, student.Age))
  588.     }
  589. |> Seq.iter (fun (id, value, age) -> printfn "%d %s %s" id (value.Print()) (age.Print()))
  590.  
  591. printfn "\n Multiple table select."
  592. query {
  593.         for student in db.Student do
  594.         for course in db.Course do
  595.         select (student, course)
  596. }
  597. |> Seq.iteri (fun index (student, course) ->
  598.     if (index = 0) then printfn "StudentID Name Age CourseID CourseName"
  599.     printfn "%d %s %s %d %s" student.StudentID student.Name (student.Age.Print()) course.CourseID course.CourseName)
  600.  
  601. printfn "\nMultiple Joins"
  602. query {
  603.     for student in db.Student do
  604.     join courseSelection in db.CourseSelection on
  605.         (student.StudentID = courseSelection.StudentID)
  606.     join course in db.Course on
  607.           (courseSelection.CourseID = course.CourseID)
  608.     select (student.Name, course.CourseName)
  609.     }
  610.  
  611. |> Seq.iter (fun (studentName, courseName) -> printfn "%s %s" studentName courseName)
  612.  
  613. printfn "\nMultiple Left Outer Joins"
  614. query {
  615.    for student in db.Student do
  616.     leftOuterJoin (for courseSelection in db.CourseSelection ->
  617.                    student.StudentID = courseSelection.StudentID) into g1
  618.     for courseSelection in g1.DefaultIfEmpty() do
  619.     leftOuterJoin (for course in db.Course ->
  620.                    courseSelection.CourseID = course.CourseID) into g2
  621.     for course in g2.DefaultIfEmpty() do
  622.     select (student.Name, course.CourseName)
  623.     }
  624. |> Seq.iter (fun (studentName, courseName) -> printfn "%s %s" studentName courseName)

对于完全的输出,当此代码在 F# interactive 时运行。

  1. --> Referenced 'C:\Program Files (x86)\Reference Assemblies\Microsoft\FSharp\3.0\Runtime\v4.0\Type Providers\FSharp.Data.TypeProviders.dll'
  2.  
  3. --> Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll'
  4.  
  5. --> Referenced 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.Linq.dll'
  6.  
  7. contains query operator
  8. 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
  9.  
  10. count query operator
  11. Number of students: 8
  12.  
  13. last query operator. Last number: 21
  14.  
  15. lastOrDefault query operator. lastOrDefault: 21
  16.  
  17. exactlyOne query operator. Student with StudentID = 1 is Abercrombie, Kim
  18.  
  19. exactlyOneOrDefault query operator. Student with StudentID = 1 is Abercrombie, Kim
  20.  
  21. headOrDefault query operator. head student is Abercrombie, Kim
  22.  
  23. select query operator. StudentID, Name: 1 Abercrombie, Kim
  24. StudentID, Name: 2 Abolrous, Hazen
  25. StudentID, Name: 3 Hance, Jim
  26. StudentID, Name: 4 Adams, Terry
  27. StudentID, Name: 5 Hansen, Claus
  28. StudentID, Name: 6 Penor, Lori
  29. StudentID, Name: 7 Perham, Tom
  30. StudentID, Name: 8 Peng, Yun-Feng
  31.  
  32. where query operator. StudentID, Name: 5 Hansen, Claus
  33. StudentID, Name: 6 Penor, Lori
  34. StudentID, Name: 7 Perham, Tom
  35. StudentID, Name: 8 Peng, Yun-Feng
  36.  
  37. minBy query operator. maxBy query operator. groupBy query operator. Age: NULL Count at that age: 1
  38. Age: 10 Count at that age: 1
  39. Age: 11 Count at that age: 1
  40. Age: 12 Count at that age: 3
  41. Age: 13 Count at that age: 1
  42. Age: 14 Count at that age: 1
  43.  
  44. sortBy query operator. StudentID, Name: 1 Abercrombie, Kim
  45. StudentID, Name: 2 Abolrous, Hazen
  46. StudentID, Name: 4 Adams, Terry
  47. StudentID, Name: 3 Hance, Jim
  48. StudentID, Name: 5 Hansen, Claus
  49. StudentID, Name: 8 Peng, Yun-Feng
  50. StudentID, Name: 6 Penor, Lori
  51. StudentID, Name: 7 Perham, Tom
  52.  
  53. sortByDescending query operator. StudentID, Name: 7 Perham, Tom
  54. StudentID, Name: 6 Penor, Lori
  55. StudentID, Name: 8 Peng, Yun-Feng
  56. StudentID, Name: 5 Hansen, Claus
  57. StudentID, Name: 3 Hance, Jim
  58. StudentID, Name: 4 Adams, Terry
  59. StudentID, Name: 2 Abolrous, Hazen
  60. StudentID, Name: 1 Abercrombie, Kim
  61.  
  62. thenBy query operator. StudentID, Name: 10 Abercrombie, Kim
  63. StudentID, Name: 11 Hansen, Claus
  64. StudentID, Name: 12 Adams, Terry
  65. StudentID, Name: 12 Hance, Jim
  66. StudentID, Name: 12 Perham, Tom
  67. StudentID, Name: 13 Penor, Lori
  68. StudentID, Name: 14 Abolrous, Hazen
  69.  
  70. thenByDescending query operator. StudentID, Name: 10 Abercrombie, Kim
  71. StudentID, Name: 11 Hansen, Claus
  72. StudentID, Name: 12 Perham, Tom
  73. StudentID, Name: 12 Hance, Jim
  74. StudentID, Name: 12 Adams, Terry
  75. StudentID, Name: 13 Penor, Lori
  76. StudentID, Name: 14 Abolrous, Hazen
  77.  
  78. groupValBy query operator. Age: NULL Count at that age: 1
  79. Name: Peng, Yun-Feng
  80. Age: 10 Count at that age: 1
  81. Name: Abercrombie, Kim
  82. Age: 11 Count at that age: 1
  83. Name: Hansen, Claus
  84. Age: 12 Count at that age: 3
  85. Name: Hance, Jim
  86. Name: Adams, Terry
  87. Name: Perham, Tom
  88. Age: 13 Count at that age: 1
  89. Name: Penor, Lori
  90. Age: 14 Count at that age: 1
  91. Name: Abolrous, Hazen
  92.  
  93. sumByNullable query operator
  94. Sum of ages: 84
  95.  
  96. minByNullable
  97. Minimum age: 10
  98.  
  99. maxByNullable
  100. Maximum age: 14
  101.  
  102. averageBy
  103. Average student ID: 4.500000
  104.  
  105. averageByNullable
  106. Average age: 12
  107.  
  108. find query operator
  109. Found a match with StudentID = 1
  110.  
  111. all query operator
  112. Do all students have a comma in the name? true
  113.  
  114. head query operator
  115. Found the head student with StudentID = 1
  116.  
  117. nth query operator
  118. Third number is 11
  119.  
  120. skip query operator
  121. StudentID = 2
  122. StudentID = 3
  123. StudentID = 4
  124. StudentID = 5
  125. StudentID = 6
  126. StudentID = 7
  127. StudentID = 8
  128.  
  129. skipWhile query operator
  130. Number = 5
  131. Number = 7
  132. Number = 11
  133. Number = 18
  134. Number = 21
  135.  
  136. sumBy query operator
  137. Sum of student IDs: 36
  138.  
  139. take query operator
  140. StudentID = 1
  141. StudentID = 2
  142.  
  143. takeWhile query operator
  144. Number = 1
  145. Number = 5
  146. Number = 7
  147.  
  148. sortByNullable query operator
  149. StudentID, Name, Age: 8 Peng, Yun-Feng NULL
  150. StudentID, Name, Age: 1 Abercrombie, Kim 10
  151. StudentID, Name, Age: 5 Hansen, Claus 11
  152. StudentID, Name, Age: 7 Perham, Tom 12
  153. StudentID, Name, Age: 3 Hance, Jim 12
  154. StudentID, Name, Age: 4 Adams, Terry 12
  155. StudentID, Name, Age: 6 Penor, Lori 13
  156. StudentID, Name, Age: 2 Abolrous, Hazen 14
  157.  
  158. sortByNullableDescending query operator
  159. StudentID, Name, Age: 2 Abolrous, Hazen 14
  160. StudentID, Name, Age: 6 Penor, Lori 13
  161. StudentID, Name, Age: 7 Perham, Tom 12
  162. StudentID, Name, Age: 3 Hance, Jim 12
  163. StudentID, Name, Age: 4 Adams, Terry 12
  164. StudentID, Name, Age: 5 Hansen, Claus 11
  165. StudentID, Name, Age: 1 Abercrombie, Kim 10
  166. StudentID, Name, Age: 8 Peng, Yun-Feng NULL
  167.  
  168. thenByNullable query operator
  169. StudentID, Name, Age: 1 Abercrombie, Kim 10
  170. StudentID, Name, Age: 2 Abolrous, Hazen 14
  171. StudentID, Name, Age: 4 Adams, Terry 12
  172. StudentID, Name, Age: 3 Hance, Jim 12
  173. StudentID, Name, Age: 5 Hansen, Claus 11
  174. StudentID, Name, Age: 8 Peng, Yun-Feng NULL
  175. StudentID, Name, Age: 6 Penor, Lori 13
  176. StudentID, Name, Age: 7 Perham, Tom 12
  177.  
  178. thenByNullableDescending query operator
  179. StudentID, Name, Age: 1 Abercrombie, Kim 10
  180. StudentID, Name, Age: 2 Abolrous, Hazen 14
  181. StudentID, Name, Age: 4 Adams, Terry 12
  182. StudentID, Name, Age: 3 Hance, Jim 12
  183. StudentID, Name, Age: 5 Hansen, Claus 11
  184. StudentID, Name, Age: 8 Peng, Yun-Feng NULL
  185. StudentID, Name, Age: 6 Penor, Lori 13
  186. StudentID, Name, Age: 7 Perham, Tom 12
  187. All students:
  188. Abercrombie, Kim 1 10
  189. Abolrous, Hazen 2 14
  190. Hance, Jim 3 12
  191. Adams, Terry 4 12
  192. Hansen, Claus 5 11
  193. Penor, Lori 6 13
  194. Perham, Tom 7 12
  195. Peng, Yun-Feng 8 NULL
  196.  
  197. Count of students:
  198. Student count: 8
  199.  
  200. Exists.
  201. " Abercrombie, Kim"
  202. "Abolrous, Hazen"
  203. "Hance, Jim"
  204. "Adams, Terry"
  205. "Hansen, Claus"
  206. "Perham, Tom"
  207.  
  208. Group by age and count
  209. NULL 1
  210. 10 1
  211. 11 1
  212. 12 3
  213. 13 1
  214. 14 1
  215.  
  216. Group value by age. NULL 1
  217. 10 1
  218. 11 1
  219. 12 3
  220. 13 1
  221. 14 1
  222.  
  223. Group students by age where age > 10. Age: 11
  224. Hansen, Claus
  225. Age: 12
  226. Hance, Jim
  227. Adams, Terry
  228. Perham, Tom
  229. Age: 13
  230. Penor, Lori
  231. Age: 14
  232. Abolrous, Hazen
  233.  
  234. Group students by age and print counts of number of students at each age with more than 1 student. Age: 12 Count: 3
  235.  
  236. Group students by age and sum ages. Age: 0
  237. Count: 1
  238. Total years:
  239. Age: 10
  240. Count: 1
  241. Total years: 10
  242. Age: 11
  243. Count: 1
  244. Total years: 11
  245. Age: 12
  246. Count: 3
  247. Total years: 36
  248. Age: 13
  249. Count: 1
  250. Total years: 13
  251. Age: 14
  252. Count: 1
  253. Total years: 14
  254.  
  255. 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
  256. Count: 3
  257.  
  258. Select students from a set of IDs
  259. Name: Abercrombie, Kim
  260. Name: Abolrous, Hazen
  261. Name: Hansen, Claus
  262.  
  263. Look for students with Name match _e% pattern and take first two. Penor, Lori
  264. Perham, Tom
  265.  
  266. Look for students with Name matching [abc]% pattern. Abercrombie, Kim
  267. Abolrous, Hazen
  268. Adams, Terry
  269.  
  270. Look for students with name matching [^abc]% pattern. Hance, Jim
  271. Hansen, Claus
  272. Penor, Lori
  273. Perham, Tom
  274. Peng, Yun-Feng
  275.  
  276. Look for students with name matching [^abc]% pattern and select ID. 3
  277. 5
  278. 6
  279. 7
  280. 8
  281.  
  282. Using Contains as a query filter. Abercrombie, Kim
  283. Abolrous, Hazen
  284. Hance, Jim
  285. Adams, Terry
  286. Hansen, Claus
  287. Perham, Tom
  288.  
  289. Searching for names from a list. Join Student and CourseSelection tables. 2 Abolrous, Hazen 2
  290. 3 Hance, Jim 3
  291. 5 Hansen, Claus 5
  292. 2 Abolrous, Hazen 2
  293. 5 Hansen, Claus 5
  294. 6 Penor, Lori 6
  295. 3 Hance, Jim 3
  296. 2 Abolrous, Hazen 2
  297. 1 Abercrombie, Kim 1
  298. 2 Abolrous, Hazen 2
  299. 5 Hansen, Claus 5
  300. 2 Abolrous, Hazen 2
  301. 3 Hance, Jim 3
  302. 2 Abolrous, Hazen 2
  303. 3 Hance, Jim 3
  304.  
  305. Left Join Student and CourseSelection tables. 1 Abercrombie, Kim 10 9 3 1
  306. 2 Abolrous, Hazen 14 1 1 2
  307. 2 Abolrous, Hazen 14 4 2 2
  308. 2 Abolrous, Hazen 14 8 3 2
  309. 2 Abolrous, Hazen 14 10 4 2
  310. 2 Abolrous, Hazen 14 12 4 2
  311. 2 Abolrous, Hazen 14 14 5 2
  312. 3 Hance, Jim 12 2 1 3
  313. 3 Hance, Jim 12 7 2 3
  314. 3 Hance, Jim 12 13 5 3
  315. 3 Hance, Jim 12 15 7 3
  316. 4 Adams, Terry 12 NULL NULL NULL
  317. 5 Hansen, Claus 11 3 1 5
  318. 5 Hansen, Claus 11 5 2 5
  319. 5 Hansen, Claus 11 11 4 5
  320. 6 Penor, Lori 13 6 2 6
  321. 7 Perham, Tom 12 NULL NULL NULL
  322. 8 Peng, Yun-Feng 0 NULL NULL NULL
  323.  
  324. Join with count
  325. 15
  326.  
  327. Join with distinct. Abercrombie, Kim 2
  328. Abercrombie, Kim 3
  329. Abercrombie, Kim 5
  330. Abolrous, Hazen 2
  331. Abolrous, Hazen 5
  332. Abolrous, Hazen 6
  333. Abolrous, Hazen 3
  334. Hance, Jim 2
  335. Hance, Jim 1
  336. Adams, Terry 2
  337. Adams, Terry 5
  338. Adams, Terry 2
  339. Hansen, Claus 3
  340. Hansen, Claus 2
  341. Perham, Tom 3
  342.  
  343. Join with distinct and count. 15
  344.  
  345. Selecting students with age between 10 and 15. Abercrombie, Kim
  346. Abolrous, Hazen
  347. Hance, Jim
  348. Adams, Terry
  349. Hansen, Claus
  350. Penor, Lori
  351. Perham, Tom
  352.  
  353. Selecting students with age either 11 or 12. Hance, Jim
  354. Adams, Terry
  355. Hansen, Claus
  356. Perham, Tom
  357.  
  358. Selecting students in a certain age range and sorting. Penor, Lori 13
  359. Perham, Tom 12
  360. Hance, Jim 12
  361. Adams, Terry 12
  362.  
  363. Selecting students with certain ages, taking account of possibility of nulls. Hance, Jim
  364. Adams, Terry
  365.  
  366. Union of two queries. Abercrombie, Kim 10
  367. Abolrous, Hazen 14
  368. Hance, Jim 12
  369. Adams, Terry 12
  370. Hansen, Claus 11
  371. Penor, Lori 13
  372. Perham, Tom 12
  373. Peng, Yun-Feng NULL
  374.  
  375. Intersect of two queries. Using if statement to alter results for special value. 1 10 10
  376. 2 14 14
  377. 3 12 12
  378. 4 12 12
  379. 5 11 11
  380. 6 13 13
  381. 7 12 12
  382. 8 NULL NULL
  383.  
  384. Using if statement to alter results special values. 1 10 10
  385. 2 14 14
  386. 3 12 12
  387. 4 12 12
  388. 5 11 11
  389. 6 13 13
  390. 7 12 12
  391. 8 NULL NULL
  392.  
  393. Multiple table select. StudentID Name Age CourseID CourseName
  394. 1 Abercrombie, Kim 10 1 Algebra I
  395. 2 Abolrous, Hazen 14 1 Algebra I
  396. 3 Hance, Jim 12 1 Algebra I
  397. 4 Adams, Terry 12 1 Algebra I
  398. 5 Hansen, Claus 11 1 Algebra I
  399. 6 Penor, Lori 13 1 Algebra I
  400. 7 Perham, Tom 12 1 Algebra I
  401. 8 Peng, Yun-Feng NULL 1 Algebra I
  402. 1 Abercrombie, Kim 10 2 Trigonometry
  403. 2 Abolrous, Hazen 14 2 Trigonometry
  404. 3 Hance, Jim 12 2 Trigonometry
  405. 4 Adams, Terry 12 2 Trigonometry
  406. 5 Hansen, Claus 11 2 Trigonometry
  407. 6 Penor, Lori 13 2 Trigonometry
  408. 7 Perham, Tom 12 2 Trigonometry
  409. 8 Peng, Yun-Feng NULL 2 Trigonometry
  410. 1 Abercrombie, Kim 10 3 Algebra II
  411. 2 Abolrous, Hazen 14 3 Algebra II
  412. 3 Hance, Jim 12 3 Algebra II
  413. 4 Adams, Terry 12 3 Algebra II
  414. 5 Hansen, Claus 11 3 Algebra II
  415. 6 Penor, Lori 13 3 Algebra II
  416. 7 Perham, Tom 12 3 Algebra II
  417. 8 Peng, Yun-Feng NULL 3 Algebra II
  418. 1 Abercrombie, Kim 10 4 History
  419. 2 Abolrous, Hazen 14 4 History
  420. 3 Hance, Jim 12 4 History
  421. 4 Adams, Terry 12 4 History
  422. 5 Hansen, Claus 11 4 History
  423. 6 Penor, Lori 13 4 History
  424. 7 Perham, Tom 12 4 History
  425. 8 Peng, Yun-Feng NULL 4 History
  426. 1 Abercrombie, Kim 10 5 English
  427. 2 Abolrous, Hazen 14 5 English
  428. 3 Hance, Jim 12 5 English
  429. 4 Adams, Terry 12 5 English
  430. 5 Hansen, Claus 11 5 English
  431. 6 Penor, Lori 13 5 English
  432. 7 Perham, Tom 12 5 English
  433. 8 Peng, Yun-Feng NULL 5 English
  434. 1 Abercrombie, Kim 10 6 French
  435. 2 Abolrous, Hazen 14 6 French
  436. 3 Hance, Jim 12 6 French
  437. 4 Adams, Terry 12 6 French
  438. 5 Hansen, Claus 11 6 French
  439. 6 Penor, Lori 13 6 French
  440. 7 Perham, Tom 12 6 French
  441. 8 Peng, Yun-Feng NULL 6 French
  442. 1 Abercrombie, Kim 10 7 Chinese
  443. 2 Abolrous, Hazen 14 7 Chinese
  444. 3 Hance, Jim 12 7 Chinese
  445. 4 Adams, Terry 12 7 Chinese
  446. 5 Hansen, Claus 11 7 Chinese
  447. 6 Penor, Lori 13 7 Chinese
  448. 7 Perham, Tom 12 7 Chinese
  449. 8 Peng, Yun-Feng NULL 7 Chinese
  450.  
  451. Multiple Joins
  452. Abercrombie, Kim Trigonometry
  453. Abercrombie, Kim Algebra II
  454. Abercrombie, Kim English
  455. Abolrous, Hazen Trigonometry
  456. Abolrous, Hazen English
  457. Abolrous, Hazen French
  458. Abolrous, Hazen Algebra II
  459. Hance, Jim Trigonometry
  460. Hance, Jim Algebra I
  461. Adams, Terry Trigonometry
  462. Adams, Terry English
  463. Adams, Terry Trigonometry
  464. Hansen, Claus Algebra II
  465. Hansen, Claus Trigonometry
  466. Perham, Tom Algebra II
  467.  
  468. Multiple Left Outer Joins
  469. Abercrombie, Kim Trigonometry
  470. Abercrombie, Kim Algebra II
  471. Abercrombie, Kim English
  472. Abolrous, Hazen Trigonometry
  473. Abolrous, Hazen English
  474. Abolrous, Hazen French
  475. Abolrous, Hazen Algebra II
  476. Hance, Jim Trigonometry
  477. Hance, Jim Algebra I
  478. Adams, Terry Trigonometry
  479. Adams, Terry English
  480. Adams, Terry Trigonometry
  481. Hansen, Claus Algebra II
  482. Hansen, Claus Trigonometry
  483. Penor, Lori
  484. Perham, Tom Algebra II
  485. Peng, Yun-Feng
  486.  
  487. type schema
  488. val db : schema.ServiceTypes.SimpleDataContextTypes.MyDatabase1
  489. val student : System.Data.Linq.Table<schema.ServiceTypes.Student>
  490. val data : int list = [1; 5; 7; 11; 18; 21]
  491. type Nullable<'T
  492.                 when 'T : (new : unit ->  'T) and 'T : struct and
  493.                      'T :> System.ValueType> with
  494.   member Print : unit -> string
  495. val num : int = 21
  496. val student2 : schema.ServiceTypes.Student
  497. val student3 : schema.ServiceTypes.Student
  498. val student4 : schema.ServiceTypes.Student
  499. val student5 : int = 1
  500. val student6 : int = 8
  501. val idList : int list = [1; 2; 5; 10]
  502. val idQuery : seq<int>
  503. val names : string [] = [|"a"; "b"; "c"|]
  504. module Queries = begin
  505.   val query1 : System.Linq.IQueryable<string * System.Nullable<int>>
  506.   val query2 : System.Linq.IQueryable<string * System.Nullable<int>>
  507. end
  508. module Queries2 = begin
  509.   val query1 : System.Linq.IQueryable<string * System.Nullable<int>>
  510.   val query2 : System.Linq.IQueryable<string * System.Nullable<int>>
  511. end
请参见


            

参考

Linq.QueryBuilder 类 (F#)                       

其他资源

F# 语言参考                       
计算表达式 (F#)            

[转]查询表达式 (F#)的更多相关文章

  1. C# 标准查询表达式

    一.标准查询运算符 1.C#提供了标准查询运算符,例如我想选择专利一系列(pantents)中以年份19开头的专利,可以用如下语句: IEnumerable<Patent> pantent ...

  2. Linq之查询表达式语法详解

    1.闲言碎语 由于项目的需要接触到Linq,刚开始有些不适应,好多概念都很模糊.不过经过一段时间的摸索,慢慢地对Linq有了一个更加深入的了解.在此记录一下备忘.      2.查询表达式语法 执行L ...

  3. 《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符

    (1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量. 透明标识符只在翻译过程中存在,翻译结束将不再出现. (2)翻译步骤 ①带有into连续语句的Select和Group语句 from. ...

  4. Nhibernate系列学习之(三) Criteria查询表达式增删改查

    Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...

  5. LINQ查询表达式详解(2)——查询表达式的转换

    简介 C#在执行LINQ查询表达式的时候,并不会指定其执行语义,而是将查询表达式转换为遵循查询表达式模式的方法的调用.具体而言,查询表达式将转换为以下名称的调用:Where.Select.Select ...

  6. 如何使用 Entity Framework 构造动态查询表达式

    一般的程序员做上几年以后, 或多或少的都有些代码的积累, 我也不例外. 作为微软技术程序员, 自从Linq和EF出来之后, 就基本上爱不释手了, 且不说执行效率的问题, 单单就开发效率和代码的可移植性 ...

  7. Linq查询表达式

    目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...

  8. 《C#本质论》读书笔记(15)使用查询表达式的LINQ

    15.1 查询表达式的概念 简单的查询表达式 private static void ShowContextualKeywords1() { IEnumerable<string> sel ...

  9. lambda表达式和查询表达式

    (1)Lambda表达式定义: Lambda是创建匿名函数的另一种形式.它比对应的匿名方法更加的简化.因此,所有的情况都推荐使用Lambda表达式.   它可以包括表达式和语句,并且用于创建委托和事件 ...

随机推荐

  1. 【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 ...

  2. 全栈JavaScript之路(十六)HTML5 HTMLDocument 类型的变化

    HTML5 扩展了 HTMLDocument, 添加了新的功能. 1.document.readState = 'loading' || 'complete'  //支持readyState 属性的浏 ...

  3. url加密并计算时间

    将URL地址参数进行加密传输提高网站安全性 加密算法,直接调用就好 function keyED($txt,$encrypt_key){ $encrypt_key = md5($encrypt_key ...

  4. C项目实践--网络协议和套接字编程

    1.TCP/IP协议 TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议,ICMP(Internet Control Message Proto ...

  5. 头文件与cpp文件为什么要分开写

    最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以  类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...

  6. Restrictions.or多个条件用法

    两个条件或查询: Restrictions.or(Restrictions.in("username",list1),Restrictions.idEq(1)); 三个或多个条件查 ...

  7. jfreechart应用1--环境配置

    jfreechart应用1--环境配置 JFreeChart是一组功能强大.灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图.饼图.曲线图.甘特图等.它能够用在Swing和We ...

  8. Newtonsoft.Json.dll 反序列化JSON字符串

    上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向 ...

  9. BZOJ3669(NOI2014):魔法森林 (LCT维护最小生成树)

    为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N ...

  10. 进程、轻量级进程(LWP)、线程

    进程.轻量级进程(LWP).线程 进程:程序执行体,有生命期,用来分配资源的实体 线程:分配CPU的实体. 用户空间实现,一个线程阻塞,所有都阻塞. 内核实现,不会所用相关线程都阻塞.用LWP实现,用 ...