微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以 Thoth.Json 编码格式获取查询结果

如何解决以 Thoth.Json 编码格式获取查询结果

我试图从一个表中获取一个 id 列表作为一个数组/整数列表,然后用 Thoth 对其进行编码并输出

功能

let listofIds (columnId: int) =
    let ids = db.Query<int> $"Select id From table Where column = {columnId}"
    ids.ToArray //Tried AsList as well

调试器显示查询已连接并且 ids 数组填充了正确的值,但在调用时在编码器处生成异常:

module PageController
let loadHomePage =   
    let ids = module.listofIds 2
    Encode.Auto.toString(4,ids)

例外:

System.TypeInitializationException: The type initializer for '<StartupCode$WebApplication>.$PageController' threw an exception.
 ---> System.Exception: Cannot generate auto encoder for Microsoft.FSharp.Core.FSharpFunc`2[[Microsoft.FSharp.Core.Unit,FSharp.Core,Version=5.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a],[system.int32[],System.Private.CoreLib,Version=6.0.0.0,PublicKeyToken=7cec85d7bea7798e]]. Please pass an extra encoder.
   at Microsoft.FSharp.Core.PrintfModule.PrintFormatToStringThenFail@1433.Invoke(String message) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\printf.fs:line 1433
   at Thoth.Json.Net.Encode.autoEncodeRecordsAndUnions(Fsharpmap`2 extra,CaseStrategy caseStrategy,Boolean skipNullField,Type t)
   at Thoth.Json.Net.Encode.autoEncoder(Fsharpmap`2 extra,Type t)
   at Thoth.Json.Net.Encode.Auto.generateEncoder[T](FSharpOption`1 caseStrategy,FSharpOption`1 extra,FSharpOption`1 skipNullField)
   at Thoth.Json.Net.Encode.Auto.toString[T](Int32 space,T value,FSharpOption`1 caseStrategy,FSharpOption`1 skipNullField)
   at <StartupCode$WebApplication>.$PageController..cctor() in C:\Users\dredgy\RiderProjects\WebApplication\WebApplication\PageController.fs:line 25
   --- End of inner exception stack trace ---
   at PageController.get_loadHomePage()
   at <StartupCode$WebApplication>.$startup.Configure@25-1.Invoke(HttpContext context) in C:\Users\dredgy\RiderProjects\WebApplication\WebApplication\Startup.fs:line 26
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
--- End of stack trace from prevIoUs location ---
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

解决方法

问题在于您的 listOfIds 函数不返回数字数组。它返回一个函数。

如果您询问正在使用的任何 IDE,listOfIds 的类型是什么,它会告诉您如下信息:

listOfIds : int -> (unit -> int array)

在最后一行,您显然打算在查询结果上调用方法 .ToArray(),但您只引用它,将其转换为函数并作为 { 的结果返回{1}}。此函数的类型为 listOfIds,因此 unit -> int array 本身的结果就是这样。

然后你试图把它传递给 listOfIds(不管那是什么),它抱怨它不知道如何编码一个 F# 函数:

Encode.Auto.toString

要解决此问题,请确保您确实调用Cannot generate auto encoder for Microsoft.FSharp.Core.FSharpFunc... 方法,并为其提供了参数。在这种情况下(我只能假设,因为我不知道 ToArray 是什么),该方法只有一个 db 类型的参数,相当于 C# 中的“无参数”,所以这就是你应该通过的:

unit

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。