F# 如何将可空Guid字段映射到F中的Sqlprovider#

F# 如何将可空Guid字段映射到F中的Sqlprovider#,f#,F#,我得到一个错误: System.InvalidCastException: 'Unable to cast object of type 'System.Guid' to type 'Microsoft.FSharp.Core.FSharpOption`1 使用此代码: let products = query { for product in ctx.Dbo.Products do select product } |>

我得到一个错误:

System.InvalidCastException: 'Unable to cast object of type 'System.Guid'
to type 'Microsoft.FSharp.Core.FSharpOption`1
使用此代码:

let products = 
    query {
        for product in ctx.Dbo.Products do
            select product
    } 
    |> Seq.map(fun p -> p.MapTo<Product>())
    |> Seq.toList
let产品=
质疑{
对于ctx.Dbo.Products中的产品
精选产品
} 
|>Seq.map(乐趣p->p.MapTo())
|>序号:toList
我已经将我的类型缩小到了几个字段,以了解发生了什么

type Product = {
    Id: Guid
    SellDiscountCalcTypeId: Option<Guid>
    Code: string
}
类型产品={
Id:Guid
SellDiscountCalcTypeId:选项
代码:字符串
}
并且我的数据提供程序设置正确(useOptionTypes=true)

类型smBoomProvider=
SqlDataProvider<
DatabaseVendor=Common.DatabaseProviderTypes.MSSQLSERVER,
ConnectionString=smBoomConn,
单个Samount=1000,
UseOptionTypes=true
>

对于所有为空的字段,没有错误,但只要字段中有任何内容,它就会在运行时出错。

不幸的是,
MapTo
方法似乎不支持
UseOptionTypes
标志。你可以解决这个问题,但这并不漂亮。一种方法是手动映射列:

let mapping (col : string, value : obj) =
    match col with
        | "SellDiscountCalcTypeId" ->
            if isNull value then None
            else Some (value :?> Guid)
            :> obj
        | _ -> value

let products = 
    query {
        for product in ctx.Dbo.Products do
            select product
    } 
    |> Seq.map (fun p -> p.MapTo<Product>(mapping))   // use manual mapping
    |> Seq.toList

不幸的是,
MapTo
方法似乎不支持
UseOptionTypes
标志。你可以解决这个问题,但这并不漂亮。一种方法是手动映射列:

let mapping (col : string, value : obj) =
    match col with
        | "SellDiscountCalcTypeId" ->
            if isNull value then None
            else Some (value :?> Guid)
            :> obj
        | _ -> value

let products = 
    query {
        for product in ctx.Dbo.Products do
            select product
    } 
    |> Seq.map (fun p -> p.MapTo<Product>(mapping))   // use manual mapping
    |> Seq.toList
您是否在“Seq.map(fun p->p.MapTo()”之前查看了p,例如在MapTo函数之前插入“|>Seq.map id”行,并因此在MapTo函数之前检查p?或者尝试按属性分配属性它可能是SellDiscountCalcTypeId,但那里的源类型是什么?您是否查看了“Seq.map(fun p->p.MapTo()”之前的p,例如插入“|>Seq.map id”在MapTo函数之前检查p?或按属性分配尝试属性它可能是SellDiscountCalcTypeId,但那里的源类型是什么。
module Product =

    let create (id, sellDiscountCalcTypeId, code) =
        {
            Id = id
            SellDiscountCalcTypeId = sellDiscountCalcTypeId
            Code = code
        }

let products = 
    query {
        for product in ctx.Dbo.Products do
            select (product.Id, product.SellDiscountCalcTypeId, product.Code)   // explicitly select fields
    } 
    |> Seq.map Product.create
    |> Seq.toList