Интерполированные строки в F # - PullRequest
4 голосов
/ 07 февраля 2020

Я пытаюсь использовать интерполированную SQL функцию запроса Entity Framework Core в F #, которая требует FormattableString. Однако, к моему удивлению, он не работает, так как я не могу найти способ преобразовать обычную строку F # в этот тип. Я подумал, что просто делать то, что вы делаете в C#, будет работать, но это не так. Вот код, который у меня сейчас есть:

let fromDbUser (u : Entity.User) = 
    {
        name = u.Name
        age = u.Age
        phone = u.Phone
    }

let mname = "Foo" 

let ctx = new Entity.DatabaseContext()
ctx.User.FromSqlInterpolated($"Select * FROM User Where name = {mname};") 
|> Seq.map(fromDbUser)
|> printfn "%A"

Запуск этого блока кода приводит к ошибке компиляции:

Этот токен зарезервирован для будущего использования

Я пытался гуглить, но я не мог найти способ заставить это работать, любая помощь будет очень признательна!

Ответы [ 2 ]

5 голосов
/ 08 февраля 2020

F # не имеет интерполяции строк.

Для него существует RF C, который утвержден в принципе .

Ошибка состоит в том, что символ $ зарезервирован (на 6 лет + на момент написания) и, вероятно, будет использоваться для интерполяции строк при добавлении.

4 голосов
/ 08 февраля 2020

Как отметил Дейв, интерполяция еще не реализована. Но для методов, которые абсолютно требуют FormattableString или IFormattable, вы можете использовать FormattableStringFactory.Create

let query (sql: FormattableString)  = 
    printfn "%s" (sql.ToString(null, null))

let mname = "Foo"         
let fstr = FormattableStringFactory.Create("Select * FROM User Where name = {0};", mname)

query fstr
...