7

我正在尝试在 F# 中使用 Entity Framework Core 插值 SQL 查询函数,该函数需要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"

运行该代码块会产生编译错误:

此令牌保留供将来使用

我一直在尝试用谷歌搜索,但我找不到任何方法来让它工作,任何帮助将不胜感激!

4

3 回答 3

11

当被问到这个问题时,F# 没有字符串插值。

但今天,有一个RFC已合并到F# 5.0中,允许在 F# 中进行字符串插值。


错误是因为该$符号已保留(截至撰写时已保留 6 年以上),并且在添加时可能会用于字符串插值。

于 2020-02-07T21:49:16.203 回答
4

正如 Dave 所指出的,插值尚未实现。但是对于绝对需要 anFormattableString或 an 的方法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
于 2020-02-08T12:20:22.860 回答
2

它可从 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

于 2020-11-17T04:36:44.593 回答