【问题标题】:Converting Types F#转换类型 F#
【发布时间】:2019-09-15 17:16:54
【问题描述】:

我有一个像这样的歧视性工会

type AbcJson = JsonProvider<"""
{
    "Id": 1234,
    "List": [
          {
            "BT": "abc",
            "Year": 2019,
            "A": 9223372036854775806
          },
          {
            "BT": "bottomUp",
            "Year": 2019
          }
        ]
}
""">

type Event =
    | Cdf of CdfJson.Root
    | Abc of AbcJson.Root

我还有一个从 db 返回值的函数

type g = SqlCommandProvider<"
            Select [BT], [Year], [A] from dbo.Abc;
            " , connectionString>

let dbGet = 
    use cmd = new g(connectionString)
    let data = cmd.Execute() 
    data |> Seq.toArray

let data = dbGet
printfn "%A" data 
// [|{ BT = "abc"; Year = 2019; A = Some 1L };
//   { BT = "abc"; Year = 2019; A = None }|] 

但是当我尝试这样做时

let q = Abc(AbcJson.Root(1002, data));

我收到这样的错误

Type mismatch. Expecting a
'JsonProvider‹...>.List []'
but given a 'SqlCommandProvider<...>.Record []'
The type 'JsonProvider‹...>.List' does not match the type 
'SqICommandProvider<...>.Record'

我无法投射SqlCommandProvider&lt;...&gt;.Record [] to JsonProvider‹...&gt;.List []。我该怎么做才能投射SqlCommandProvider&lt;...&gt;.Record [] to JsonProvider‹...&gt;.List []?某种参考资料或文档会很有帮助。

【问题讨论】:

    标签: .net types functional-programming f#


    【解决方案1】:

    在您的代码中,您从两个来源检索兼容数据——JSON 来源和数据库。但是,JsonProvider 和 SqlCommandProviders 正在生成两种不同的类型来存储该数据。 JsonProvider 创建自己的记录,SqlCommandProvider 创建自己的记录。两条不同的记录可能具有相似的成员,但如果不将数据从一种类型复制到另一种类型,您将无法将一个“强制转换”到另一个。

    虽然您可以将数据从 SqlCommandProvider 的记录复制到 JsonProvider 的记录中,但我不确定这是否是最好的方法。 F# 类型提供程序对于创建记录以匹配给定数据非常方便。但是,在您的情况下,您可能会考虑创建自己的记录。像这样的...

    type AbcData {
       string: BT
       int: Year
       long option: A }
    

    ...存储来自 JSON 源和数据库的数据。

    然后,您将来自 JsonProvider 记录的数据复制到 your 记录类型,并将来自 SqlCommandProvider 记录的数据复制到 your 记录类型。这样,您的记录类型就是 JSON 和数据库数据的共同目的地。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-20
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多