Scope — F#

Examples/Scope/FSharp/CreateDepartment.fs
use! fusionConnection = context.OpenFusionConnectionAsync()

let departmentDto =
    {
        Id = 1111L
        Name = "Computer Science"
        Budget = 250_000m
        Courses =
            [
                { Id = 101L; Title = "Introduction to Programming"; Credits = 5 }
                { Id = 102L; Title = "Algorithms and Data Structures"; Credits = 6 }
                { Id = 103L; Title = "Database Systems"; Credits = 5 }
                { Id = 104L; Title = "Operating Systems"; Credits = 4 }
            ]
    }

let scope = fusionConnection.CreateScope()

scope.Table<Department>().Insert([
    {
        DepartmentID = departmentDto.Id
        Name = departmentDto.Name
        Budget = departmentDto.Budget
    }
])
|> ignore

departmentDto.Courses
|> List.map (fun courseDto ->
    {
        CourseID = courseDto.Id
        Title = courseDto.Title
        Credits = courseDto.Credits
        DepartmentID = departmentDto.Id
    })
|> scope.Table<Course>().Insert
|> ignore

let! result = scope.FlushAsync()
return box result
Examples/Scope/FSharp/ModifyDepartment.fs
use! fusionConnection = context.OpenFusionConnectionAsync()

let parameters = Parameters()
parameters.Add("DepartmentID", 1111L)

let! existingDepartment =
    fusionConnection.GetDataNodesAsync(
        """
        SELECT *
        FROM Department D
            LEFT JOIN Course C ON D.DepartmentID = C.DepartmentID
        WHERE D.DepartmentId = @DepartmentID
        ORDER BY D.Name;
        """,
        From<Department>(Join<Course>()),
        parameters)

let incomingDepartmentDto =
    {
        Id = 1111L
        Name = "Computer Science and Engineering"
        Budget = 300_000m
        Courses =
            [
                { Id = 101L; Title = "Introduction to Programming"; Credits = 5 }
                { Id = 102L; Title = "Advanced Algorithms and Data Structures"; Credits = 7 }
                { Id = 104L; Title = "Operating Systems"; Credits = 4 }
                { Id = 0L; Title = "Distributed Systems"; Credits = 5 }
            ]
    }

let scope = fusionConnection.CreateScope<Department>(existingDepartment)

scope.Table<Department>().Merge([
    {
        DepartmentID = incomingDepartmentDto.Id
        Name = incomingDepartmentDto.Name
        Budget = incomingDepartmentDto.Budget
    }
])
|> ignore

incomingDepartmentDto.Courses
|> List.map (fun courseDto ->
    {
        CourseID = courseDto.Id
        Title = courseDto.Title
        Credits = courseDto.Credits
        DepartmentID = incomingDepartmentDto.Id
    })
|> scope.Table<Course>().Merge
|> ignore

let! result = scope.FlushAsync()
return box result
Examples/Scope/FSharp/RemoveDepartment.fs
use! fusionConnection = context.OpenFusionConnectionAsync()

let parameters = Parameters()
parameters.Add("DepartmentID", 1111L)

let! existingDepartment =
    fusionConnection.GetDataNodesAsync(
        """
        SELECT *
        FROM Department D
            LEFT JOIN Course C ON D.DepartmentID = C.DepartmentID
        WHERE D.DepartmentId = @DepartmentID
        ORDER BY D.Name;
        """,
        From<Department>(Join<Course>()),
        parameters)

let scope = fusionConnection.CreateScope<Department>(existingDepartment)

scope.Table<Department>().Delete() |> ignore
scope.Table<Course>().Delete() |> ignore

let! result = scope.FlushAsync()
return box result