我有这样的歧视工会
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 []
?某种参考或文档将非常有帮助。
答案 0 :(得分:2)
在您的代码中,您正在从两个来源检索兼容的数据-JSON来源和数据库。但是,JsonProvider和SqlCommandProviders正在生成两种不同的类型来存储该数据。 JsonProvider创建自己的记录,而SqlCommandProvider创建自己的记录。这两个不同的记录可能具有相似的成员,但是如果不将数据从一种类型复制到另一种类型,就无法将它们“广播”到另一种。
虽然您可以将数据从SqlCommandProvider的记录复制到JsonProvider的记录中,但是我不确定这是否是最佳方法。 F#类型提供程序对于创建记录以匹配给定数据确实非常方便。但是,根据您的情况,您可以考虑创建自己的记录。像这样...
type AbcData {
string: BT
int: Year
long option: A }
...在其中存储JSON源和数据库中的数据。
然后,您将来自JsonProvider记录的数据复制到您的记录类型,并将来自SqlCommandProvider记录的数据复制到您记录类型。这样,您的记录类型就是JSON和数据库数据的通用目标。