Как обновить несколько полей из объекта с помощью FSharp.Data.SqlClient

Я изучал F# в связи с CRUD с данными. и я использую FSharp.Data.SqlClient

Я не вижу простого способа обновить все поля объекта.

Например, я хочу выполнить приведенный ниже код, а затем я хочу представить эти данные на веб-странице. Веб-страница внесет некоторые изменения (возможно) - тогда я хочу использовать объект для обновления базы данных.

Я не хочу писать код для сопоставления каждого отдельного поля. Кроме того, я все еще пытаюсь понять, как это делается неизменным.

let getOrders2() = 
    let cmd = new SqlCommandProvider<"
    SELECT top 10 * from orders
    " , connectionString>(connectionString)

    let orders = cmd.Execute()

    let o2 = orders |> Seq.toList

person Martin Thompson    schedule 19.02.2021    source источник
comment
Попробуйте использовать Dapper: github.com/Dzoukr/Dapper.FSharp#update   -  person Scott Hutchinson    schedule 20.02.2021
comment
@ScottHutchinson Спасибо, но я думаю, вам нужно определить все объекты F # в Dappa? это кажется немного громоздким, если вам не нужно ..   -  person Martin Thompson    schedule 20.02.2021


Ответы (1)


Одновременное обновление нескольких полей из объекта очень просто:

let updateEmployee employee =
    use cmd =
        new SqlCommandProvider<
            "update Employees set \
            FirstName = @FirstName,
            LastName = @LastName
            where EmployeeID = @EmployeeID",
            connectionString>(connectionString)
    let nRows =
        cmd.Execute(
            employee.FirstName,
            employee.LastName,
            employee.EmployeeID)
    assert(nRows = 1)

Написание веб-приложения с неизменяемыми объектами — большая тема. Вы используете F# только на сервере или также и в клиенте?

person brianberns    schedule 20.02.2021
comment
благодарю вас . F# на сервере — выставляйте DAL через Rest API. Vuejs на клиенте (точнее, Quasar). Я хотел избежать необходимости устанавливать каждое поле — в некоторых из моих таблиц есть довольно много полей. Есть ли простой способ сделать это в этой структуре? - person Martin Thompson; 20.02.2021
comment
У вас могут быть разные операторы обновления, которые устанавливают только поля, необходимые для каждого варианта использования. Или вы можете написать и вызвать хранимую процедуру общего назначения, которая использует XML (или JSON) вместо прямого выполнения оператора обновления SQL. Это зависит от того, насколько креативным вы хотите стать. - person brianberns; 20.02.2021
comment
спасибо, я думаю, я хочу обновить только те поля, которые изменились. Так что мне как-то нужно перебрать свойства объекта и сравнить их, я думаю..? - person Martin Thompson; 21.02.2021
comment
Вы можете сделать это, но по моему опыту это почти всегда больше проблем, чем пользы. В типичном приложении CRUD лучше иметь один грязный флаг на уровне объекта, а не отслеживать на уровне свойства. Вы можете оптимизировать позже, если это необходимо. Просто мое мнение. - person brianberns; 21.02.2021