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