如何解决以 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 举报,一经查实,本站将立刻删除。