Интерполированные строки в F#
Я пытаюсь использовать функцию интерполированного 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 ответа
F# не имеет строковой интерполяции.
Для него есть RFC, одобренный в принципе.
Ошибка в том, что $
символ зарезервирован (на 6 лет + на момент написания) и, вероятно, будет использоваться для интерполяции строк при его добавлении.
Как заметил Дэйв, интерполяция еще не реализована. Но для методов, которые абсолютно требуют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
Он доступен с F# 5.0.
> let mname = "Foo" ;;
val mname : string = "Foo"
> let str = $"Select * FROM User Where name = {mname};" ;;
val str : string = "Select * FROM User Where name = Foo;"
Проверь это. https://docs.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-50#string-interpolation