zoukankan      html  css  js  c++  java
  • [转]查询表达式 (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=SERVERINSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;">
    
    let db = schema.GetDataContext()
    
    // Needed for some query operator examples:
    let data = [ 1; 5; 7; 11; 18; 21]
    
    
    
    表 1。查询运算符

    运算符

    描述

    contains

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

    let isStudent11 =
        query {
            for student in db.Student do
            select student.Age.Value
            contains 11
        }
    
    

    count

    返回所选元素的数量。

    let countOfStudents =
        query {
            for student in db.Student do
            select student
            count
        }
    
    

    last

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

    let number = 
        query {
            for number in data do
            last
        }
    
    

    lastOrDefault

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

    let number =
        query {
            for number in data do
            where (number < 0)
            lastOrDefault
        }
    
    

    exactlyOne

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

    let student =
        query {
            for student in db.Student do
            where (student.StudentID = 1)
            select student
            exactlyOne
        }
    
    

    exactlyOneOrDefault

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

    let student =
        query {
            for student in db.Student do
            where (student.StudentID = 1)
            select student
            exactlyOneOrDefault
        }
    
    

    headOrDefault

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

    let student =
        query {
            for student in db.Student do
            select student
            headOrDefault
        }
    
    

    select

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

    query {
        for student in db.Student do
        select student
        }
    
    

    where

    根据指定谓词的元素。

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

    minBy

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

    let student =
        query {
            for student in db.Student do
            minBy student.StudentID
        }
    
    

    maxBy

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

    let student =
        query {
            for student in db.Student do
            maxBy student.StudentID
        }
    
    

    groupBy

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

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

    sortBy

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

    query {
        for student in db.Student do
        sortBy student.Name
        select student
    }
    
    

    sortByDescending

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

    query {
        for student in db.Student do
        sortByDescending student.Name
        select student
    }
    
    

    thenBy

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

    query {
        for student in db.Student do
        where student.Age.HasValue
        sortBy student.Age.Value
        thenBy student.Name
        select student
    }
    
    

    thenByDescending

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

    query {
        for student in db.Student do
        where student.Age.HasValue
        sortBy student.Age.Value
        thenByDescending student.Name
        select student
    }
    
    

    groupValBy

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

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

    join

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

    query {
        for student in db.Student do 
        join selection in db.CourseSelection on
              (student.StudentID = selection.StudentID)
        select (student, selection)
    }
    

    groupJoin

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

    query {
        for student in db.Student do
        groupJoin courseSelection in db.CourseSelection on
                   (student.StudentID = courseSelection.StudentID) into g
        for courseSelection in g do
        join course in db.Course on (courseSelection.CourseID = course.CourseID)
        select (student.Name, course.CourseName)
        }
    
    

    leftOuterJoin

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

    query {
        for student in db.Student do
        leftOuterJoin selection in db.CourseSelection on
                       (student.StudentID = selection.StudentID) into result
        for selection in result.DefaultIfEmpty() do
        select (student, selection)
        }
    
    

    sumByNullable

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

    query {
        for student in db.Student do
        sumByNullable student.Age
    }
    
    

    minByNullable

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

    query {
        for student in db.Student do
        minByNullable student.Age
    }
    
    

    maxByNullable

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

    query {
        for student in db.Student do
        maxByNullable student.Age
        }
    
    

    averageByNullable

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

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

    averageBy

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

    query {
        for student in db.Student do
        averageBy (float student.StudentID)
    }
    
    
    

    distinct

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

    query {
        for student in db.Student do
        join selection in db.CourseSelection on
              (student.StudentID = selection.StudentID)
        distinct        
    }
    

    exists

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

    query {
        for student in db.Student do
        where (query { for courseSelection in db.CourseSelection do
                       exists (courseSelection.StudentID = student.StudentID) })
        select student
    }
    
    

    find

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

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

    all

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

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

    head

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

    query {
        for student in db.Student do
        head
    }
    
    

    nth

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

    query {
        for numbers in data do
        nth 3
    }
    
    

    skip

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

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

    skipWhile

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

    query {
        for number in data do
        skipWhile (number < 3)
        select student
        }
    
    

    sumBy

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

    query {
       for student in db.Student do
       sumBy student.StudentID
       }
    
    

    take

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

    query {
       for student in db.Student do
       select student
       take 2
       }
    
    

    takeWhile

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

    query {
        for number in data do
        takeWhile (number < 10)
        }
    
    

    sortByNullable

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

    query {
        for student in db.Student do
        sortByNullable student.Age
        select student
    }
    
    

    sortByNullableDescending

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

    query {
        for student in db.Student do
        sortByNullableDescending student.Age
        select student
    }
    
    

    thenByNullable

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

    query {
        for student in db.Student do
        sortBy student.Name
        thenByNullable student.Age
        select student
    }
    
    

    thenByNullableDescending

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

    query {
        for student in db.Student do
        sortBy student.Name
        thenByNullableDescending student.Age
        select student
    }
    
    
    Transact-SQL 和 F# 查询表达式进行            

                
              

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

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

    Transact-SQL (不区分大小写)                                       

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

    选择所有字段从表。                                       

    SELECT * FROM Student
    
    // All students.
    query {
        for student in db.Student do
        select student
    }
    
    

    计数记录在表中。                                       

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

    EXISTS                                       

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

    分组                                       

    SELECT Student.Age, COUNT(*) FROM Student
    GROUP BY Student.Age
    
    // Group by age and count.
    query {
        for n in db.Student do
        groupBy n.Age into g
        select (g.Key, g.Count())
    }
    // OR
    query {
        for n in db.Student do
        groupValBy n.Age n.Age into g
        select (g.Key, g.Count())
    }
    
    

    分组加上条件。                                       

    SELECT Student.Age, COUNT(*) 
    FROM Student
    GROUP BY Student.Age
    HAVING student.Age > 10
    
    // Group 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.Key, g.Count())
    }
    
    

    分组的计数情况。                                       

    SELECT Student.Age, COUNT(*)
    FROM Student
    GROUP BY Student.Age
    HAVING COUNT(*) > 1
    
    // Group students by age and count 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())
    }
    
    

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

    SELECT Student.Age, COUNT(*), SUM(Student.Age) as total
    FROM Student
    GROUP BY Student.Age
    
    // Group 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)
    }
    
    

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

    SELECT Student.Age, COUNT(*) as myCount
    FROM Student
    GROUP BY Student.Age
    HAVING COUNT(*) > 1
    ORDER BY COUNT(*) DESC
    
    // Group students by age, 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())
    }
    
    

    IN     设置指定值                                       

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

    LIKE   和 TOP。                                       

    -- '_e%' matches strings where the second character is 'e'
    SELECT TOP 2 * FROM Student
    WHERE Student.Name LIKE '_e%'
    
    // Look 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   
        }
    
    

    与设置的模式匹配LIKE。                                       

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

    设置了独占模式的LIKE。                                       

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

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

    SELECT StudentID AS ID FROM Student
    WHERE Student.Name LIKE '[^abc]%'
    
    open System.Data.Linq.SqlClient;
    
    printfn "
    Look 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)
    
    

    LIKE   ,将子字符串搜索。                                       

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

    只有两个表的简单 JOIN。                                       

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

    只有 两个表的LEFT JOIN。                                       

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

    JOIN   和 COUNT                                       

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

    DISTINCT                                       

    SELECT DISTINCT StudentID FROM CourseSelection
    
    // Join with distinct.
    query {
        for student in db.Student do
        join selection in db.CourseSelection on
              (student.StudentID = selection.StudentID)
        distinct        
    }
    
    

    清单的计数。                                       

    SELECT DISTINCT COUNT(StudentID) FROM CourseSelection
    
    // Join with distinct and count.
    query {
        for n in db.Student do 
        join e in db.CourseSelection on
              n.StudentID = e.StudentID)
        distinct
        count       
    }
    
    

    BETWEEN                                       

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

    OR                                       

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

    与排序的OR                                       

    SELECT * FROM Student
    WHERE Student.Age =12 OR Student.Age = 13
    ORDER BY Student.Age DESC
    
    // 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
    }
    
    

    TOP   ,OR和排序。                                       

    SELECT TOP 2 student.Name FROM Student
    WHERE Student.Age = 11 OR Student.Age = 12
    ORDER BY Student.Name DESC
    
    
    // Selecting students with certain ages,
    // taking account of the 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
        }
    
    

    两个查询UNION。                                       

    SELECT * FROM Student
    UNION
    SELECT * FROM lastStudent
    
    // 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)
    
    

    两个查询的交集。                                       

    SELECT * FROM Student
    INTERSECT
    SELECT * FROM LastStudent
    
    // 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)
    
    

    CASE   情况。                                       

    SELECT student.StudentID, 
        CASE Student.Age
            WHEN -1 THEN 100
            ELSE Student.Age
            END,
            Student.Age
    from Student
    
    // 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))
        }
    
    

    多个用例。                                       

    SELECT Student.StudentID, 
        CASE Student.Age
            WHEN -1 THEN 100
            WHEN 0 THEN 1000
            ELSE Student.Age
        END,
        Student.Age
    FROM Student
    
    // Using if statement to alter results for 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>(1000), student.Age)
                else (student.StudentID, student.Age, student.Age))
        }
    
    

    多个表。                                       

    SELECT * FROM Student, Course
    
    // Multiple table select.
    query {
            for student in db.Student do
            for course in db.Course do
            select (student, course)
    }
    
    

    多联接。                                       

    SELECT Student.Name, Course.CourseName
    FROM Student
    JOIN CourseSelection
    ON CourseSelection.StudentID = Student.StudentID
    JOIN Course
    ON Course.CourseID = CourseSelection.CourseID
    
    
     // Multiple 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)
        }
    
    
    
    
    
    
    
    
    
    
    

    多个左外部联接。                                       

    SELECT Student.Name, Course.CourseName
    FROM Student
    LEFT OUTER JOIN CourseSelection
    ON CourseSelection.StudentID = Student.StudentID
    LEFT OUTER JOIN Course
    ON Course.CourseID = CourseSelection.CourseID
    
    
    // Using leftOuterJoin with multiple joins.
    query {
        for student in db.Student do
        leftOuterJoin courseSelection in db.CourseSelection on
            (student.StudentID = courseSelection.StudentID) into g1
        for courseSelection in g1.DefaultIfEmpty() do
        leftOuterJoin course in db.Course on
                       (courseSelection.CourseID = course.CourseID) into g2
        for course in g2.DefaultIfEmpty() do
        select (student.Name, course.CourseName)
        }
    
    

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

    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=SERVERINSTANCE;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 "
    contains 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 "
    count query operator"
    query {
        for student in db.Student do
        select student
        count
        }
    |> printfn "Number of students: %d" 
    
    
    printfn "
    last query operator." 
    let num =
        query {
            for number in data do
            sortBy number
            last
            }
    printfn "Last number: %d" num
    
    
    open Microsoft.FSharp.Linq
    
    printfn "
    lastOrDefault query operator." 
    query {
            for number in data do
            sortBy number
            lastOrDefault
            }
    |> printfn "lastOrDefault: %d"
    
    printfn "
    exactlyOne 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 "
    exactlyOneOrDefault 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 "
    headOrDefault query operator."
    let student4 =
        query {
            for student in db.Student do
            select student
            headOrDefault
            }
    printfn "head student is %s" student4.Name
    
    printfn "
    select 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 "
    where 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 "
    minBy query operator."
    let student5 =
        query {
            for student in db.Student do
            minBy student.StudentID
        }
    
    printfn "
    maxBy query operator."
    let student6 =
        query {
            for student in db.Student do
            maxBy student.StudentID
        }
    
    printfn "
    groupBy 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 "
    sortBy 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 "
    sortByDescending 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 "
    thenBy 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 "
    thenByDescending 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 "
    groupValBy 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 "
     sumByNullable query operator"
    query {
        for student in db.Student do
        sumByNullable student.Age
        }
    |> (fun sum -> printfn "Sum of ages: %s" (sum.Print()))
    
    printfn "
     minByNullable"
    query {
        for student in db.Student do
        minByNullable student.Age
        }
    |> (fun age -> printfn "Minimum age: %s" (age.Print()))
    
    printfn "
     maxByNullable"
    query {
        for student in db.Student do
        maxByNullable student.Age
        }
    |> (fun age -> printfn "Maximum age: %s" (age.Print()))
    
    printfn "
     averageBy"
    query {
        for student in db.Student do
        averageBy (float student.StudentID)
        }
    |> printfn "Average student ID: %f"
    
    printfn "
     averageByNullable"
    query {
        for student in db.Student do
        averageByNullable (Nullable.float student.Age)
        }
    |> (fun avg -> printfn "Average age: %s" (avg.Print()))
    
    printfn "
     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 "
     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 "
     head query operator"
    query {
        for student in db.Student do
        head
        }
    |> (fun student -> printfn "Found the head student with StudentID = %d" student.StudentID)
    
    printfn "
     nth query operator"
    query {
        for numbers in data do
        nth 3
        }
    |> printfn "Third number is %d"
    
    printfn "
     skip query operator"
    query {
        for student in db.Student do
        skip 1
        }
    |> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
    
    printfn "
     skipWhile query operator"
    query {
        for number in data do
        skipWhile (number < 3)
        select number
        }
    |> Seq.iter (fun number -> printfn "Number = %d" number)
    
    
    printfn "
     sumBy query operator"
    query {
       for student in db.Student do
       sumBy student.StudentID
       }
    |> printfn "Sum of student IDs: %d" 
    
    printfn "
     take query operator"
    query {
       for student in db.Student do
       select student
       take 2
       }
    |> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
    
    printfn "
     takeWhile query operator"
    query {
        for number in data do
        takeWhile (number < 10)
        }
    |> Seq.iter (fun number -> printfn "Number = %d" number)
    
    printfn "
     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 "
     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 "
     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 "
     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 "
    Count of students: "
    query {
            for student in db.Student do        
            count
        }
    |>  (fun count -> printfn "Student count: %d" count)
    
    printfn "
    Exists."
    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 "
     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 "
     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 "
    Group 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 "
    Group 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 "
    Group 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 "
    Group 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 "
     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 "
    Look 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 "
    Look 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 "
    Look 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 "
    Look 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 "
     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 "
    Searching 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 "
    Join 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 "
    Left 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 "
    Join with count"
    query {
            for n in db.Student do 
            join (for e in db.CourseSelection -> n.StudentID = e.StudentID)
            count        
        }
    |>  printfn "%d"
    
    printfn "
     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 "
     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 "
     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 "
     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 "
     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 "
     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 "
     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 "
     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 "
     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 "
     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 "
     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 "
    Multiple 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 "
    Multiple 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 AssembliesMicrosoftFSharp3.0Runtimev4.0Type ProvidersFSharp.Data.TypeProviders.dll'
    
    
    --> Referenced 'C:WindowsMicrosoft.NETFrameworkv4.0.30319System.Data.dll'
    
    
    --> Referenced 'C:WindowsMicrosoft.NETFrameworkv4.0.30319System.Data.Linq.dll'
    
    
    contains query operator
    Binding session to 'C:UsersghogenAppDataLocalTemp	mp5E3C.dll'...  Binding session to 'C:UsersghogenAppDataLocalTemp	mp611A.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  
    请参见            

                
              

    参考

    Linq.QueryBuilder 类 (F#)                       

    其他资源

    F# 语言参考                       
    计算表达式 (F#)            
  • 相关阅读:
    centos7上安装JupyterHub
    我的测试第一篇博客
    TCP,SYN,FIN扫描
    nmap使用帮助翻译
    MySQL 常用函数
    MySQL 视图
    MySQL 索引
    JAVA 注解
    JAVA 反射
    spring boot MySQL极简封装
  • 原文地址:https://www.cnblogs.com/freeliver54/p/3941605.html
Copyright © 2011-2022 走看看