F# 获取Thoth.Json可编码格式的查询结果

F# 获取Thoth.Json可编码格式的查询结果,f#,f#-data,F#,F# Data,我试图从表中获取一个ID列表作为数组/整数列表,然后用Thoth编码并输出 功能是 let listOfIds (columnId: int) = let ids = db.Query<int> $"Select id From table Where column = {columnId}" ids.ToArray //Tried AsList as well 例外情况: System.TypeInitializationException:

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

功能是

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

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, Culture=neutral, 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, CaseStrategy caseStrategy, Boolean skipNullField, 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 extra, 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)
在最后一行中,您显然打算调用method.ToArray查询结果,但是您只引用了它,将其转换为函数并作为ListofId的结果返回。这个函数的类型是unit->int-array,所以listOfIds本身的结果就是这样

然后您试图将其传递给Encode.Auto.toString,不管它是什么,它会抱怨它不知道如何对F函数进行编码:

Cannot generate auto encoder for Microsoft.FSharp.Core.FSharpFunc...
要修复此问题,请确保通过给ToArray方法指定参数来实际调用它。在这种情况下,我只能假设,因为我不知道db是什么,该方法只有一个unit类型的参数,这相当于C中没有参数,因此您应该传递:

let listOfIds (columnId: int) =
    let ids = db.Query<int> $"Select id From table Where column = {columnId}"
    ids.ToArray()

当你的问题是一个异常或错误时,一个好的做法是将该异常/错误的全文粘贴到问题正文中,这样无论谁尝试回答都不必猜测。在第一篇文章中添加的是,类型不希望被编码。当使用类型为x={id:int}的自定义类型时,它确实可以工作,但是因为我只想要一个id列表a la[1,2,3],这不是一个理想的解决方案。干杯必须再次检查这不是抄写错误。
let listOfIds (columnId: int) =
    let ids = db.Query<int> $"Select id From table Where column = {columnId}"
    ids.ToArray()