Шикарный точечный сетевой запрос в F#

Я пытаюсь использовать Dapper dot net в F # для выполнения простого запроса SQLite. Dapper возвращает набор динамических объектов: использовать их в C# просто, но, насколько я понял, F# не имеет готовой реализации поиска динамических свойств.

Это работает, но я полагаю, что есть лучшие способы сделать это, не прибегая к отражению:

let (?) x prop =
    let flags = BindingFlags.GetProperty ||| BindingFlags.InvokeMethod
    x.GetType().InvokeMember(prop, flags, null, x, [||])

let doQuery () =
    //...
    let conn = new SQLiteConnection (connString)
    conn.Open ()

    conn.Query("select first_name from customers")
        |> Seq.map (fun c -> c ? first_name)
        |> List.ofSeq

Каков наилучший способ реализации? оператор в этом случае?


person Francesco De Vittori    schedule 20.02.2012    source источник
comment
Кажется, этот поток отвечает на ваш вопрос: stackoverflow.com/questions/6150087 /f-динамический-доступ-объекта   -  person pad    schedule 20.02.2012
comment
@pad Хороший ответ. Вы должны были добавить свой ответ в качестве ответа, чтобы я мог проголосовать за него :-)   -  person Onorio Catenacci    schedule 20.02.2012
comment
@OnorioCatenacci: я добавляю это как ответ, не уверен, что это стоит ответа :).   -  person pad    schedule 20.02.2012
comment
Нит: используйте c?first_name (без пробелов) для идиоматичности. ? здесь как ..   -  person Brian    schedule 20.02.2012
comment
Не решение, но рассматривали ли вы вместо этого использование FsSql (github.com/mausch/FsSql)? Он написан специально для F#.   -  person Mauricio Scheffer    schedule 20.02.2012
comment
Или SOMA soma.codeplex.com   -  person Mauricio Scheffer    schedule 20.02.2012
comment
Я обращаюсь к существующей базе данных, поэтому у меня нет выбора, но я буду помнить о FsSql и SOMA для будущих нужд!   -  person Francesco De Vittori    schedule 24.02.2012
comment
@FrancescoDeVittori: FsSql не нужна конкретная схема базы данных, главное — просто сделать ADO.NET более привлекательным по сравнению с F#.   -  person Mauricio Scheffer    schedule 24.02.2012
comment
@Mauricio Scheffer: о, извините, я этого не понял. Немедленно переключитесь на FsSql!   -  person Francesco De Vittori    schedule 26.02.2012


Ответы (2)


Эта ветка содержит несколько решений вашей проблемы. В частности, FSharp.Interop.Dynamic доступен в NuGet и готов к использованию. .

person pad    schedule 20.02.2012
comment
Я надеялся, что есть более простой способ (или без внешней библиотеки). Я полагаю, великая сила/большая ответственность и т.д... :-) - person Francesco De Vittori; 24.02.2012

При использовании Dapper с F# вы можете указать параметры запроса, используя Анонимные записи F# и сопоставьте результаты непосредственно с записью F#, например:

[<CLIMutable>]
type CustomerDto = 
    {
        FirstName: string
    }

let selectSql = "select first_name as FirstName from customers where first_name = @firstName"

conn.Query<CustomerDto>(selectSql, {|firstName = "Francesco"|})

Обратите внимание, что анонимные записи F# были представлены в F# 4.6.

person Sean Kearon    schedule 05.05.2020