当从数据库中检索唯一项时,我需要满足客户端提供的 ID 没有数据的情况。例如,ID不正确或缓存数据已过期。

我在此示例中使用的特定数据库客户端库是 ServiceStack.Redis,但我认为该原则适用于任何 CLR 库。

我已经使用如下所示的记录类型定义了我的数据结构。现在,当我使用客户端库为数据库中不存在的键检索数据时,将返回一个 null 值。这一点,我期待并且很高兴。问题是 F# 编译器不允许我对这种情况进行模式匹配 - 即使它可能在运行时发生!

type MyRecordType = { id:int; name:string; desc:string } 
 
let redis = new RedisClient("localhost") 
let nullCheck = 
    let item = redis.Get<MyRecordType> "xxx" 
    // it is possible that item is null 
    // but the compiler will not permit the match 
    match item with 
    | null -> None 
    | _ -> Some item 

Redis 客户端库包含一个返回 bool 值的“ContainsKey”方法,我可以先使用它,但这里不需要两次调用数据库。另一种方法是使用 C# 项目中定义的类作为数据结构,但这涉及太多开销。该属性也不允许匹配 null

我想知道我应该使用什么约定来处理这种情况,因为它似乎是一个非常普遍的问题?

请您参考如下方法:

很遗憾,您不能对记录使用 AllowNullLiteral。因此,最好的解决方案是只创建一个空值并像这样进行相等性检查

if item = Operators.Unchecked.defaultof<_> then None else Some(item) 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!