Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med frågeuttryck kan du fråga en datakälla och placera data i önskat formulär. Frågeuttryck ger stöd för LINQ i F#.
Syntax
query { expression }
Anmärkningar
Frågeuttryck är en typ av beräkningsuttryck som liknar sekvensuttryck. Precis som du anger en sekvens genom att ange kod i ett sekvensuttryck anger du en uppsättning data genom att ange kod i ett frågeuttryck. I ett sekvensuttryck identifierar nyckelordet yield data som ska returneras som en del av den resulterande sekvensen. I frågeuttryck utför nyckelordet select samma funktion. Förutom nyckelordet select stöder F# också ett antal frågeoperatorer som liknar delarna i en SQL SELECT-instruktion. Här är ett exempel på ett enkelt frågeuttryck som använder Entity Framework Core för att fråga en databas.
// F# query expression example using Entity Framework Core
open System
open System.Linq
open Microsoft.EntityFrameworkCore
// Entity type
[<CLIMutable>]
type Customer = {
    CustomerID: int
    CompanyName: string
    ContactName: string
}
// Database context
type NorthwindContext() =
    inherit DbContext()
    
    [<DefaultValue>]
    val mutable private customers: DbSet<Customer>
    member this.Customers with get() = this.customers and set v = this.customers <- v
    
    override _.OnConfiguring(optionsBuilder: DbContextOptionsBuilder) =
        optionsBuilder.UseInMemoryDatabase("NorthwindDatabase") |> ignore
// Create and seed database
let db = 
    let context = new NorthwindContext()
    context.Customers.AddRange([|
        { CustomerID = 1; CompanyName = "Alfreds Futterkiste"; ContactName = "Maria Anders" }
        { CustomerID = 2; CompanyName = "Ana Trujillo Emparedados y helados"; ContactName = "Ana Trujillo" }
        { CustomerID = 3; CompanyName = "Antonio Moreno Taquería"; ContactName = "Antonio Moreno" }
    |]) |> ignore
    context.SaveChanges() |> ignore
    context
// A query expression
let query1 =
    query {
        for customer in db.Customers do
            select customer
    }
// Print results
query1
|> Seq.iter (fun customer -> printfn "Company: %s Contact: %s" customer.CompanyName customer.ContactName)
I föregående kodexempel finns frågeuttrycket i klammerparenteser. Innebörden av koden i uttrycket är att returnera varje kund i tabellen Kunder i databasen i frågeresultatet. Frågeuttryck returnerar en typ som implementerar IQueryable<T> och IEnumerable<T>, och så att de kan itereras med hjälp av Seq-modulen som exemplet visar.
Varje beräkningsuttryckstyp skapas från en builder-klass. Builder-klassen för frågeberäkningsuttrycket är QueryBuilder. Mer information finns i Beräkningsuttryck och QueryBuilder-klass.
Frågeoperatorer
Med frågeoperatorer kan du ange information om frågan, till exempel att ange villkor för poster som ska returneras eller ange sorteringsordningen för resultaten. Frågekällan måste ha stöd för frågeoperatorn. Om du försöker använda en frågeoperator System.NotSupportedException som inte stöds utlöses.
Endast uttryck som kan översättas till SQL tillåts i frågeuttryck. Till exempel tillåts inga funktionsanrop i uttrycken när du använder where frågeoperatorn.
Tabell 1 visar tillgängliga frågeoperatorer. Mer information finns i Table2, som jämför SQL-frågor och motsvarande F#-frågeuttryck senare i det här avsnittet. Vissa frågeoperatorer stöds inte av vissa typprovidrar. I synnerhet är OData-typprovidern begränsad i de frågeoperatorer som den stöder på grund av begränsningar i OData.
Den här tabellen förutsätter en databas i följande formulär:
              
              
            
Koden i tabellerna som följer förutsätter också följande databasanslutningskod med Entity Framework Core. Projekt bör lägga till paketreferenser till Microsoft.EntityFrameworkCore och Microsoft.EntityFrameworkCore.InMemory (eller en annan EF Core-provider för produktionsscenarier). I det här exemplet används databasprovidern i minnet i demonstrationssyfte, men samma frågesyntax fungerar med valfri EF Core-provider (SQL Server, PostgreSQL osv.).
// Database setup example for query expressions using Entity Framework Core
open System
open System.Linq
open Microsoft.EntityFrameworkCore
// Define entity types that map to database tables
[<CLIMutable>]
type Student = {
    StudentID: int
    Name: string
    Age: Nullable<int>
}
[<CLIMutable>]
type Course = {
    CourseID: int
    CourseName: string
}
[<CLIMutable>]
type CourseSelection = {
    ID: int
    StudentID: int
    CourseID: int
}
// Define the database context using Entity Framework Core
type SchoolContext() =
    inherit DbContext()
    
    [<DefaultValue>]
    val mutable private student: DbSet<Student>
    member this.Student with get() = this.student and set v = this.student <- v
    
    [<DefaultValue>]
    val mutable private course: DbSet<Course>
    member this.Course with get() = this.course and set v = this.course <- v
    
    [<DefaultValue>]
    val mutable private courseSelection: DbSet<CourseSelection>
    member this.CourseSelection with get() = this.courseSelection and set v = this.courseSelection <- v
    
    override _.OnConfiguring(optionsBuilder: DbContextOptionsBuilder) =
        optionsBuilder.UseInMemoryDatabase("SchoolDatabase") |> ignore
// Create and seed the database
let createAndSeedDatabase() =
    let context = new SchoolContext()
    
    // Seed data
    context.Student.AddRange([|
        { StudentID = 1; Name = "Abercrombie, Kim"; Age = Nullable(10) }
        { StudentID = 2; Name = "Abolrous, Hazen"; Age = Nullable(14) }
        { StudentID = 3; Name = "Hance, Jim"; Age = Nullable(12) }
        { StudentID = 4; Name = "Adams, Terry"; Age = Nullable(12) }
        { StudentID = 5; Name = "Hansen, Claus"; Age = Nullable(11) }
        { StudentID = 6; Name = "Penor, Lori"; Age = Nullable(13) }
        { StudentID = 7; Name = "Perham, Tom"; Age = Nullable(12) }
        { StudentID = 8; Name = "Peng, Yun-Feng"; Age = Nullable() }
    |]) |> ignore
    
    context.Course.AddRange([|
        { CourseID = 1; CourseName = "Algebra I" }
        { CourseID = 2; CourseName = "Trigonometry" }
        { CourseID = 3; CourseName = "Algebra II" }
        { CourseID = 4; CourseName = "History" }
        { CourseID = 5; CourseName = "English" }
        { CourseID = 6; CourseName = "French" }
        { CourseID = 7; CourseName = "Chinese" }
    |]) |> ignore
    
    context.CourseSelection.AddRange([|
        { ID = 1; StudentID = 1; CourseID = 2 }
        { ID = 2; StudentID = 1; CourseID = 3 }
        { ID = 3; StudentID = 1; CourseID = 5 }
        { ID = 4; StudentID = 2; CourseID = 2 }
        { ID = 5; StudentID = 2; CourseID = 5 }
        { ID = 6; StudentID = 2; CourseID = 6 }
        { ID = 7; StudentID = 2; CourseID = 3 }
        { ID = 8; StudentID = 3; CourseID = 2 }
        { ID = 9; StudentID = 3; CourseID = 1 }
        { ID = 10; StudentID = 4; CourseID = 2 }
        { ID = 11; StudentID = 4; CourseID = 5 }
        { ID = 12; StudentID = 4; CourseID = 2 }
        { ID = 13; StudentID = 5; CourseID = 3 }
        { ID = 14; StudentID = 5; CourseID = 2 }
        { ID = 15; StudentID = 7; CourseID = 3 }
    |]) |> ignore
    
    context.SaveChanges() |> ignore
    context
// Create the database context
let db = createAndSeedDatabase()
// Needed for some query operator examples:
let data = [ 1; 5; 7; 11; 18; 21]
Tabell 1. Frågeoperatorer
| Operatör | Beskrivning | 
|---|---|
contains | 
Avgör om de markerade elementen innehåller ett angivet element.
 | 
count | Returnerar antalet markerade element.
 | 
last | Väljer det sista elementet i de som valts hittills.
 | 
lastOrDefault | Väljer det sista elementet i de som har valts hittills, eller ett standardvärde om inget element hittas.
 | 
exactlyOne | Väljer det enskilda, specifika element som valts hittills. Om flera element finns utlöses ett undantag.
 | 
exactlyOneOrDefault | Väljer det enskilda, specifika elementet för de som har valts hittills, eller ett standardvärde om elementet inte hittas.
 | 
headOrDefault | Väljer det första elementet av de som valts hittills, eller ett standardvärde om sekvensen inte innehåller några element.
 | 
select | Projekterar vart och ett av de element som valts hittills.
 | 
where | Väljer element baserat på ett angivet predikat.
 | 
minBy | Väljer ett värde för varje element som valts hittills och returnerar det lägsta resulterande värdet.
 | 
maxBy | Väljer ett värde för varje element som valts hittills och returnerar det maximala resulterande värdet.
 | 
groupBy | Grupperar de element som valts hittills enligt en angiven nyckelväljare.
 | 
sortBy | Sorterar de element som valts hittills i stigande ordning efter den angivna sorteringsnyckeln.
 | 
sortByDescending | Sorterar de element som valts hittills i fallande ordning efter den angivna sorteringsnyckeln.
 | 
thenBy | Utför en efterföljande ordning av de element som valts hittills i stigande ordning efter den angivna sorteringsnyckeln. Den här operatorn får endast användas efter en sortBy, sortByDescending, thenByeller thenByDescending.
 | 
thenByDescending | Utför en efterföljande ordning av de element som valts hittills i fallande ordning efter den angivna sorteringsnyckeln. Den här operatorn får endast användas efter en sortBy, sortByDescending, thenByeller thenByDescending.
 | 
groupValBy | Väljer ett värde för varje element som valts hittills och grupperar elementen efter den angivna nyckeln.
 | 
join | Korrelerar två uppsättningar med valda värden baserat på matchande nycklar. Observera att ordningen på nycklarna runt = -tecknet i ett kopplingsuttryck är betydande. Om raden delas efter symbolen -> i alla kopplingar måste indraget vara indraget minst så långt som nyckelordet for.
 | 
groupJoin | Korrelerar två uppsättningar med valda värden baserat på matchande nycklar och grupperar resultatet. Observera att ordningen på nycklarna runt = -tecknet i ett kopplingsuttryck är betydande.
 | 
leftOuterJoin | Korrelerar två uppsättningar med valda värden baserat på matchande nycklar och grupperar resultatet. Om en grupp är tom används en grupp med ett enda standardvärde i stället. Observera att ordningen på nycklarna runt = -tecknet i ett kopplingsuttryck är betydande.
 | 
sumByNullable | Väljer ett null-värde för varje element som valts hittills och returnerar summan av dessa värden. Om något nullbart värde inte har något värde ignoreras det.
 | 
minByNullable | Väljer ett null-värde för varje element som valts hittills och returnerar minimivärdet för dessa värden. Om något nullbart värde inte har något värde ignoreras det.
 | 
maxByNullable | Väljer ett null-värde för varje element som valts hittills och returnerar maxvärdet för dessa värden. Om något nullbart värde inte har något värde ignoreras det.
 | 
averageByNullable | Väljer ett null-värde för varje element som valts hittills och returnerar medelvärdet av dessa värden. Om något nullbart värde inte har något värde ignoreras det.
 | 
averageBy | Väljer ett värde för varje element som valts hittills och returnerar medelvärdet av dessa värden.
 | 
distinct | Väljer distinkta element från de element som valts hittills.
 | 
exists | Avgör om något element som valts hittills uppfyller ett villkor.
 | 
find | Väljer det första elementet som valts hittills och som uppfyller ett angivet villkor.
 | 
all | Avgör om alla element som valts hittills uppfyller ett villkor.
 | 
head | Väljer det första elementet från de som valts hittills.
 | 
nth | Väljer elementet vid ett angivet index bland de som valts hittills.
 | 
skip | Kringgår ett angivet antal av de element som valts hittills och väljer sedan de återstående elementen.
 | 
skipWhile | Kringgår element i en sekvens så länge ett angivet villkor är sant och väljer sedan de återstående elementen.
 | 
sumBy | Väljer ett värde för varje element som valts hittills och returnerar summan av dessa värden.
 | 
take | Väljer ett angivet antal sammanhängande element från de som har valts hittills.
 | 
takeWhile | Väljer element från en sekvens så länge ett angivet villkor är sant och hoppar sedan över de återstående elementen.
 | 
sortByNullable | Sorterar de element som valts hittills i stigande ordning efter den angivna nullbara sorteringsnyckeln.
 | 
sortByNullableDescending | Sorterar de element som valts hittills i fallande ordning efter den angivna nullbara sorteringsnyckeln.
 | 
thenByNullable | Utför en efterföljande ordning av de element som valts hittills i stigande ordning efter den angivna nullbara sorteringsnyckeln. Den här operatorn får endast användas omedelbart efter en sortBy, sortByDescending, thenByeller thenByDescending, eller deras nullbara varianter.
 | 
thenByNullableDescending | Utför en efterföljande sortering av de element som valts hittills i fallande ordning efter den angivna nullbara sorteringsnyckeln. Den här operatorn får endast användas omedelbart efter en sortBy, sortByDescending, thenByeller thenByDescending, eller deras nullbara varianter.
 | 
Jämförelse av Transact-SQL- och F#-frågeuttryck
I följande tabell visas några vanliga Transact-SQL frågor och deras motsvarigheter i F#. Koden i den här tabellen förutsätter också samma databas som föregående tabell och samma initiala kod för att konfigurera typprovidern.
Tabell 2. Transact-SQL- och F#-frågeuttryck
| Transact-SQL (inte skiftlägeskänslig) | F#-frågeuttryck (skiftlägeskänsligt) | 
|---|---|
Markera alla fält i tabellen.
 | 
 | 
Räkna poster i en tabell.
 | 
 | 
EXISTS
 | 
 | 
Gruppering
 | 
 | 
Gruppering med villkor.
 | 
 | 
Gruppering med antal villkor.
 | 
 | 
Gruppera, räkna och summera.
 | 
 | 
Gruppera, räkna och sortera efter antal.
 | 
 | 
              IN en uppsättning angivna värden
 | 
 | 
              LIKE och TOP.
 | 
 | 
              LIKE med mönstermatchningsuppsättning.
 | 
 | 
              LIKE med angivet exkluderingsmönster.
 | 
 | 
              LIKE i ett fält, men välj ett annat fält.
 | 
 | 
              LIKE, med understrängssökning.
 | 
 | 
Enkel JOIN med två tabeller.
 | 
 | 
              LEFT JOIN med två tabeller.
 | 
 | 
              JOIN med COUNT
 | 
 | 
DISTINCT
 | 
 | 
Distinkt antal.
 | 
 | 
BETWEEN
 | 
 | 
OR
 | 
 | 
              OR med beställning
 | 
 | 
              TOP, ORoch beställning.
 | 
 | 
              UNION av två frågor.
 | 
 | 
Skärningspunkt för två frågor.
 | 
 | 
              CASE tillstånd.
 | 
 | 
Flera fall.
 | 
 | 
Flera tabeller.
 | 
 | 
Flera kopplingar.
 | 
 | 
Flera yttre kopplingar till vänster.
 | 
 | 
Följande kod kan användas för att skapa exempeldatabasen för dessa exempel.
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);
Följande kod innehåller exempelkoden som visas i det här avsnittet.
open System
open System.Linq
// Define simple data types to represent our sample database
type Student = {
    StudentID: int
    Name: string
    Age: int option
}
type Course = {
    CourseID: int
    CourseName: string
}
type CourseSelection = {
    ID: int
    StudentID: int
    CourseID: int
}
// Sample data
let students = [
    { StudentID = 1; Name = "Abercrombie, Kim"; Age = Some 10 }
    { StudentID = 2; Name = "Abolrous, Hazen"; Age = Some 14 }
    { StudentID = 3; Name = "Hance, Jim"; Age = Some 12 }
    { StudentID = 4; Name = "Adams, Terry"; Age = Some 12 }
    { StudentID = 5; Name = "Hansen, Claus"; Age = Some 11 }
    { StudentID = 6; Name = "Penor, Lori"; Age = Some 13 }
    { StudentID = 7; Name = "Perham, Tom"; Age = Some 12 }
    { StudentID = 8; Name = "Peng, Yun-Feng"; Age = None }
]
let courses = [
    { CourseID = 1; CourseName = "Algebra I" }
    { CourseID = 2; CourseName = "Trigonometry" }
    { CourseID = 3; CourseName = "Algebra II" }
    { CourseID = 4; CourseName = "History" }
    { CourseID = 5; CourseName = "English" }
    { CourseID = 6; CourseName = "French" }
    { CourseID = 7; CourseName = "Chinese" }
]
let courseSelections = [
    { ID = 1; StudentID = 1; CourseID = 2 }
    { ID = 2; StudentID = 1; CourseID = 3 }
    { ID = 3; StudentID = 1; CourseID = 5 }
    { ID = 4; StudentID = 2; CourseID = 2 }
    { ID = 5; StudentID = 2; CourseID = 5 }
    { ID = 6; StudentID = 2; CourseID = 6 }
    { ID = 7; StudentID = 2; CourseID = 3 }
    { ID = 8; StudentID = 3; CourseID = 2 }
    { ID = 9; StudentID = 3; CourseID = 1 }
    { ID = 10; StudentID = 4; CourseID = 2 }
    { ID = 11; StudentID = 4; CourseID = 5 }
    { ID = 12; StudentID = 4; CourseID = 2 }
    { ID = 13; StudentID = 5; CourseID = 3 }
    { ID = 14; StudentID = 5; CourseID = 2 }
    { ID = 15; StudentID = 7; CourseID = 3 }
]
// Convert to queryable collections for LINQ operations
let db.Student = students.AsQueryable()
let coursesQueryable = courses.AsQueryable()
let courseSelectionsQueryable = courseSelections.AsQueryable()
let data = [1; 5; 7; 11; 18; 21]
type Nullable<'T when 'T : ( new : unit -> 'T) and 'T : struct and 'T :> ValueType > with
    member this.Print() =
        if this.HasValue then this.Value.ToString()
        else "NULL"
printfn "\ncontains query operator"
query {
    for student in db.Student do
    select student.Age.Value
    contains 11
}
|> printfn "Is at least one student age 11? %b"
printfn "\ncount query operator"
query {
    for student in db.Student do
    select student
    count
}
|> printfn "Number of students: %d"
printfn "\nlast query operator."
let num =
    query {
        for number in data do
        sortBy number
        last
    }
printfn "Last number: %d" num
open Microsoft.FSharp.Linq
printfn "\nlastOrDefault query operator."
query {
    for number in data do
    sortBy number
    lastOrDefault
}
|> printfn "lastOrDefault: %d"
printfn "\nexactlyOne query operator."
let student2 =
    query {
        for student in db.Student do
        where (student.StudentID = 1)
        select student
        exactlyOne
    }
printfn "Student with StudentID = 1 is %s" student2.Name
printfn "\nexactlyOneOrDefault query operator."
let student3 =
    query {
        for student in db.Student do
        where (student.StudentID = 1)
        select student
        exactlyOneOrDefault
    }
printfn "Student with StudentID = 1 is %s" student3.Name
printfn "\nheadOrDefault query operator."
let student4 =
    query {
        for student in db.Student do
        select student
        headOrDefault
    }
printfn "head student is %s" student4.Name
printfn "\nselect query operator."
query {
    for student in db.Student do
    select student
}
|> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
printfn "\nwhere query operator."
query {
    for student in db.Student do
    where (student.StudentID > 4)
    select student
}
|> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
printfn "\nminBy query operator."
let student5 =
    query {
        for student in db.Student do
        minBy student.StudentID
    }
printfn "\nmaxBy query operator."
let student6 =
    query {
        for student in db.Student do
        maxBy student.StudentID
    }
printfn "\ngroupBy query operator."
query {
    for student in db.Student do
    groupBy student.Age into g
    select (g.Key, g.Count())
}
|> Seq.iter (fun (age, count) -> printfn "Age: %s Count at that age: %d" (age.Print()) count)
printfn "\nsortBy query operator."
query {
    for student in db.Student do
    sortBy student.Name
    select student
}
|> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
printfn "\nsortByDescending query operator."
query {
    for student in db.Student do
    sortByDescending student.Name
    select student
}
|> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.StudentID student.Name)
printfn "\nthenBy query operator."
query {
    for student in db.Student do
    where student.Age.HasValue
    sortBy student.Age.Value
    thenBy student.Name
    select student
}
|> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.Age.Value student.Name)
printfn "\nthenByDescending query operator."
query {
    for student in db.Student do
    where student.Age.HasValue
    sortBy student.Age.Value
    thenByDescending student.Name
    select student
}
|> Seq.iter (fun student -> printfn "StudentID, Name: %d %s" student.Age.Value student.Name)
printfn "\ngroupValBy query operator."
query {
    for student in db.Student do
    groupValBy student.Name student.Age into g
    select (g, g.Key, g.Count())
}
|> Seq.iter (fun (group, age, count) ->
    printfn "Age: %s Count at that age: %d" (age.Print()) count
    group |> Seq.iter (fun name -> printfn "Name: %s" name))
printfn "\n sumByNullable query operator"
query {
    for student in db.Student do
    sumByNullable student.Age
}
|> (fun sum -> printfn "Sum of ages: %s" (sum.Print()))
printfn "\n minByNullable"
query {
    for student in db.Student do
    minByNullable student.Age
}
|> (fun age -> printfn "Minimum age: %s" (age.Print()))
printfn "\n maxByNullable"
query {
    for student in db.Student do
    maxByNullable student.Age
}
|> (fun age -> printfn "Maximum age: %s" (age.Print()))
printfn "\n averageBy"
query {
    for student in db.Student do
    averageBy (float student.StudentID)
}
|> printfn "Average student ID: %f"
printfn "\n averageByNullable"
query {
    for student in db.Student do
    averageByNullable (Nullable.float student.Age)
}
|> (fun avg -> printfn "Average age: %s" (avg.Print()))
printfn "\n find query operator"
query {
    for student in db.Student do
    find (student.Name = "Abercrombie, Kim")
}
|> (fun student -> printfn "Found a match with StudentID = %d" student.StudentID)
printfn "\n all query operator"
query {
    for student in db.Student do
    all (SqlMethods.Like(student.Name, "%,%"))
}
|> printfn "Do all students have a comma in the name? %b"
printfn "\n head query operator"
query {
    for student in db.Student do
    head
}
|> (fun student -> printfn "Found the head student with StudentID = %d" student.StudentID)
printfn "\n nth query operator"
query {
    for numbers in data do
    nth 3
}
|> printfn "Third number is %d"
printfn "\n skip query operator"
query {
    for student in db.Student do
    skip 1
}
|> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
printfn "\n skipWhile query operator"
query {
    for number in data do
    skipWhile (number < 3)
    select number
}
|> Seq.iter (fun number -> printfn "Number = %d" number)
printfn "\n sumBy query operator"
query {
    for student in db.Student do
    sumBy student.StudentID
}
|> printfn "Sum of student IDs: %d"
printfn "\n take query operator"
query {
    for student in db.Student do
    select student
    take 2
}
|> Seq.iter (fun student -> printfn "StudentID = %d" student.StudentID)
printfn "\n takeWhile query operator"
query {
    for number in data do
    takeWhile (number < 10)
}
|> Seq.iter (fun number -> printfn "Number = %d" number)
printfn "\n sortByNullable query operator"
query {
    for student in db.Student do
    sortByNullable student.Age
    select student
}
|> Seq.iter (fun student ->
    printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
printfn "\n sortByNullableDescending query operator"
query {
    for student in db.Student do
    sortByNullableDescending student.Age
    select student
}
|> Seq.iter (fun student ->
    printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
printfn "\n thenByNullable query operator"
query {
    for student in db.Student do
    sortBy student.Name
    thenByNullable student.Age
    select student
}
|> Seq.iter (fun student ->
    printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
printfn "\n thenByNullableDescending query operator"
query {
    for student in db.Student do
    sortBy student.Name
    thenByNullableDescending student.Age
    select student
}
|> Seq.iter (fun student ->
    printfn "StudentID, Name, Age: %d %s %s" student.StudentID student.Name (student.Age.Print()))
printfn "All students: "
query {
    for student in db.Student do
    select student
}
|> Seq.iter (fun student -> printfn "%s %d %s" student.Name student.StudentID (student.Age.Print()))
printfn "\nCount of students: "
query {
    for student in db.Student do
    count
}
|> (fun count -> printfn "Student count: %d" count)
printfn "\nExists."
query {
    for student in db.Student do
    where
        (query {
            for courseSelection in db.CourseSelection do
            exists (courseSelection.StudentID = student.StudentID) })
    select student
}
|> Seq.iter (fun student -> printfn "%A" student.Name)
printfn "\n Group by age and count"
query {
    for n in db.Student do
    groupBy n.Age into g
    select (g.Key, g.Count())
}
|> Seq.iter (fun (age, count) -> printfn "%s %d" (age.Print()) count)
printfn "\n Group value by age."
query {
    for n in db.Student do
    groupValBy n.Age n.Age into g
    select (g.Key, g.Count())
}
|> Seq.iter (fun (age, count) -> printfn "%s %d" (age.Print()) count)
printfn "\nGroup students by age where age > 10."
query {
    for student in db.Student do
    groupBy student.Age into g
    where (g.Key.HasValue && g.Key.Value > 10)
    select (g, g.Key)
}
|> Seq.iter (fun (students, age) ->
    printfn "Age: %s" (age.Value.ToString())
    students
    |> Seq.iter (fun student -> printfn "%s" student.Name))
printfn "\nGroup students by age and print counts of number of students at each age with more than 1 student."
query {
    for student in db.Student do
    groupBy student.Age into group
    where (group.Count() > 1)
    select (group.Key, group.Count())
}
|> Seq.iter (fun (age, ageCount) ->
    printfn "Age: %s Count: %d" (age.Print()) ageCount)
printfn "\nGroup students by age and sum ages."
query {
    for student in db.Student do
    groupBy student.Age into g
    let total = query { for student in g do sumByNullable student.Age }
    select (g.Key, g.Count(), total)
}
|> Seq.iter (fun (age, count, total) ->
    printfn "Age: %d" (age.GetValueOrDefault())
    printfn "Count: %d" count
    printfn "Total years: %s" (total.ToString()))
printfn "\nGroup students by age and count number of students at each age, and display all with count > 1 in descending order of count."
query {
    for student in db.Student do
    groupBy student.Age into g
    where (g.Count() > 1)
    sortByDescending (g.Count())
    select (g.Key, g.Count())
}
|> Seq.iter (fun (age, myCount) ->
    printfn "Age: %s" (age.Print())
    printfn "Count: %d" myCount)
printfn "\n Select students from a set of IDs"
let idList = [1; 2; 5; 10]
let idQuery =
    query { for id in idList do select id }
query {
    for student in db.Student do
    where (idQuery.Contains(student.StudentID))
    select student
}
|> Seq.iter (fun student ->
    printfn "Name: %s" student.Name)
printfn "\nLook for students with Name match _e%% pattern and take first two."
query {
    for student in db.Student do
    where (SqlMethods.Like( student.Name, "_e%") )
    select student
    take 2
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\nLook for students with Name matching [abc]%% pattern."
query {
    for student in db.Student do
    where (SqlMethods.Like( student.Name, "[abc]%") )
    select student
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\nLook for students with name matching [^abc]%% pattern."
query {
    for student in db.Student do
    where (SqlMethods.Like( student.Name, "[^abc]%") )
    select student
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\nLook for students with name matching [^abc]%% pattern and select ID."
query {
    for n in db.Student do
    where (SqlMethods.Like( n.Name, "[^abc]%") )
    select n.StudentID
}
|> Seq.iter (fun id -> printfn "%d" id)
printfn "\n Using Contains as a query filter."
query {
    for student in db.Student do
    where (student.Name.Contains("a"))
    select student
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\nSearching for names from a list."
let names = [|"a";"b";"c"|]
query {
    for student in db.Student do
    if names.Contains (student.Name) then select student
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\nJoin Student and CourseSelection tables."
query {
    for student in db.Student do
    join selection in db.CourseSelection
        on (student.StudentID = selection.StudentID)
    select (student, selection)
}
|> Seq.iter (fun (student, selection) -> printfn "%d %s %d" student.StudentID student.Name selection.CourseID)
printfn "\nLeft Join Student and CourseSelection tables."
query {
    for student in db.Student do
    leftOuterJoin selection in db.CourseSelection
        on (student.StudentID = selection.StudentID) into result
    for selection in result.DefaultIfEmpty() do
    select (student, selection)
}
|> Seq.iter (fun (student, selection) ->
    let selectionID, studentID, courseID =
        match selection with
        | null -> "NULL", "NULL", "NULL"
        | sel -> (sel.ID.ToString(), sel.StudentID.ToString(), sel.CourseID.ToString())
    printfn "%d %s %d %s %s %s" student.StudentID student.Name (student.Age.GetValueOrDefault()) selectionID studentID courseID)
printfn "\nJoin with count"
query {
    for n in db.Student do
    join e in db.CourseSelection
        on (n.StudentID = e.StudentID)
    count
}
|> printfn "%d"
printfn "\n Join with distinct."
query {
    for student in db.Student do
    join selection in db.CourseSelection
        on (student.StudentID = selection.StudentID)
    distinct
}
|> Seq.iter (fun (student, selection) -> printfn "%s %d" student.Name selection.CourseID)
printfn "\n Join with distinct and count."
query {
    for n in db.Student do
    join e in db.CourseSelection
        on (n.StudentID = e.StudentID)
    distinct
    count
}
|> printfn "%d"
printfn "\n Selecting students with age between 10 and 15."
query {
    for student in db.Student do
    where (student.Age.Value >= 10 && student.Age.Value < 15)
    select student
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\n Selecting students with age either 11 or 12."
query {
    for student in db.Student do
    where (student.Age.Value = 11 || student.Age.Value = 12)
    select student
}
|> Seq.iter (fun student -> printfn "%s" student.Name)
printfn "\n Selecting students in a certain age range and sorting."
query {
    for n in db.Student do
    where (n.Age.Value = 12 || n.Age.Value = 13)
    sortByNullableDescending n.Age
    select n
}
|> Seq.iter (fun student -> printfn "%s %s" student.Name (student.Age.Print()))
printfn "\n Selecting students with certain ages, taking account of possibility of nulls."
query {
    for student in db.Student do
    where
        ((student.Age.HasValue && student.Age.Value = 11) ||
         (student.Age.HasValue && student.Age.Value = 12))
    sortByDescending student.Name
    select student.Name
    take 2
}
|> Seq.iter (fun name -> printfn "%s" name)
printfn "\n Union of two queries."
module Queries =
    let query1 = query {
        for n in db.Student do
        select (n.Name, n.Age)
    }
    let query2 = query {
        for n in db.LastStudent do
        select (n.Name, n.Age)
    }
    query2.Union (query1)
    |> Seq.iter (fun (name, age) -> printfn "%s %s" name (age.Print()))
printfn "\n Intersect of two queries."
module Queries2 =
    let query1 = query {
        for n in db.Student do
        select (n.Name, n.Age)
    }
    let query2 = query {
        for n in db.LastStudent do
        select (n.Name, n.Age)
    }
    query1.Intersect(query2)
    |> Seq.iter (fun (name, age) -> printfn "%s %s" name (age.Print()))
printfn "\n Using if statement to alter results for special value."
query {
    for student in db.Student do
    select
        (if student.Age.HasValue && student.Age.Value = -1 then
            (student.StudentID, System.Nullable<int>(100), student.Age)
         else (student.StudentID, student.Age, student.Age))
}
|> Seq.iter (fun (id, value, age) -> printfn "%d %s %s" id (value.Print()) (age.Print()))
printfn "\n Using if statement to alter results special values."
query {
    for student in db.Student do
    select
        (if student.Age.HasValue && student.Age.Value = -1 then
            (student.StudentID, System.Nullable<int>(100), student.Age)
         elif student.Age.HasValue && student.Age.Value = 0 then
            (student.StudentID, System.Nullable<int>(100), student.Age)
         else (student.StudentID, student.Age, student.Age))
}
|> Seq.iter (fun (id, value, age) -> printfn "%d %s %s" id (value.Print()) (age.Print()))
printfn "\n Multiple table select."
query {
    for student in db.Student do
    for course in db.Course do
    select (student, course)
}
|> Seq.iteri (fun index (student, course) ->
    if index = 0 then
        printfn "StudentID Name Age CourseID CourseName"
    printfn "%d %s %s %d %s" student.StudentID student.Name (student.Age.Print()) course.CourseID course.CourseName)
printfn "\nMultiple Joins"
query {
    for student in db.Student do
    join courseSelection in db.CourseSelection
        on (student.StudentID = courseSelection.StudentID)
    join course in db.Course
        on (courseSelection.CourseID = course.CourseID)
    select (student.Name, course.CourseName)
}
|> Seq.iter (fun (studentName, courseName) -> printfn "%s %s" studentName courseName)
printfn "\nMultiple Left Outer Joins"
query {
    for student in db.Student do
    leftOuterJoin 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)
}
|> Seq.iter (fun (studentName, courseName) -> printfn "%s %s" studentName courseName)
Och här är de fullständiga utdata när den här koden körs i F# Interactive.
contains query operator
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