【问题标题】:Issue with DBNull when using LINQ to DataSet使用 LINQ to DataSet 时出现 DBNull 问题
【发布时间】:2010-05-20 21:40:50
【问题描述】:

我有以下 LINQ 语句:

Dim PSNum As Integer = 66 
Dim InvSeq = (From invRecord In InvSeqDataSet.RptInvSeqDT.AsQueryable() _
                Where IIf(invRecord.IsPack_NumNull(), False, invRecord.Pack_Num = PSNum) _
                Select New With _
                {.Inv = invRecord.Invoice_Num, .Seq = invRecord.Inv_Seq}).FirstOrDefault()

invRecord.Pack_Num 是一个整数类型的字段。这意味着当我尝试访问它时,如果它是 DBNull,我会得到一个 StronglyTypedException。上面的代码抛出了这个异常。但是,如果我删除“invRecord.Pack_Num = PSNum”并在其位置放置“True”之类的内容,则代码可以正常工作。

所以我想我的问题是,为什么当值实际上是 DBNull 时 invRecord.IsPack_NumNull() 返回 False,而我可以使用什么作为条件呢?一段时间以来,我一直在碰壁,但找不到解决此问题的方法。

【问题讨论】:

    标签: vb.net linq dbnull linq-to-dataset


    【解决方案1】:

    在 VB.NET 中,IIf() 评估其每个参数,因为它是一个函数,而不是语言语句。所以inv.Record.Pack_Num = PSNum 将始终被评估。

    您可以使用If() 而不是IIf()(语法相同),后者使用短路评估,因此一切都会按预期工作。

    在侧节点上,请注意具有相同行为的AndOr。如果您需要短路评估,请改用AndAlsoOrElse

    【讨论】:

    • 是的,你是对的。我不确定我是怎么错过的,但我认为情况正好相反。直觉上,我一直认为 IIf 的意思是“如果且仅当”,这意味着我想要的“短路”行为。无论如何,非常感谢。
    • 我猜是 VB 语言团队的意思是“inline if”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多