转换类型F#

时间:2019-04-26 08:10:13

标签: .net types functional-programming f#

我有这样的歧视工会

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<...>.Record [] to JsonProvider‹...>.List []。我该怎么做才能投射SqlCommandProvider<...>.Record [] to JsonProvider‹...>.List []?某种参考或文档将非常有帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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

...在其中存储JSON源和数据库中的数据。

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