【问题标题】:Interpolated strings in F#F# 中的插值字符串
【发布时间】:2020-05-24 00:49:10
【问题描述】:

我正在尝试在 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"

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

此令牌保留供将来使用

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

【问题讨论】:

    标签: sql f# entity-framework-core formattablestring


    【解决方案1】:

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

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


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

    【讨论】:

      【解决方案2】:

      正如 Dave 所指出的,插值尚未实现。 但是对于绝对需要FormattableStringIFormattable 的方法,您可以使用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
      

      【讨论】:

        【解决方案3】:

        从 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

        【讨论】:

          猜你喜欢
          • 2021-04-23
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          • 1970-01-01
          • 2019-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多