繁体   English   中英

转换类型F#

[英]Converting Types 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 [] 某种参考或文档将非常有帮助。

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

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

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

...您将来自JSON源和数据库的数据存储到其中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM