在比较器包含 DbNull 的强类型数据集上的 Linq JOIN 抛出异常

Posted

技术标签:

【中文标题】在比较器包含 DbNull 的强类型数据集上的 Linq JOIN 抛出异常【英文标题】:Linq JOIN on a strongly typed dataset where comparator contains DbNull throws exception 【发布时间】:2021-06-18 17:10:48 【问题描述】:

考虑查询:

Dim orgs = From g In dbDS.gi_game
            Join o In dbDS.gi_organisation On g.DeveloperID Equals o.ID
            Select o

这将在g.DeveloperID 为 DBNull 时引发异常(这是设计使然 - 不能将 DBNull 更改为任何其他值):

System.Data.StrongTypingException: 'The value for column 'DeveloperID' in table 'gi_game' is DBNull.'

我试过了:

Dim orgs = From g In dbDS.gi_game
            Join o In dbDS.gi_organisation On g.DeveloperID Equals o.ID
            Where Not g.IsDeveloperIDNull
            Select o

但是在查询枚举时遇到了同样的错误。如何控制 dbnulls?

更新:

感谢 Shaybakov 在下面的回答,通过混合 linq 和 lambda 解决了问题。 vb.net代码:

Dim orgs = From g In dbDS.gi_game.Where(Function(x) x.IsDeveloperIDNull = False)
            Join o In dbDS.gi_organisation On g.DeveloperID Equals o.ID
            Select o

【问题讨论】:

可以把C#标签换成vb.net吗? 您可以添加 where 子句来排除这些记录 如果您想回答自己的问题,请发布答案,而不是将答案编辑到问题中。你也会得到赞成票.. 公平地说,Shaybakov 回答了这个问题 - 这就是我将他标记为答案的原因。 【参考方案1】:

c#语法

From g In dbDS.gi_game.Where(x=>!x.IsDeveloperIDNull())
        Join o In dbDS.gi_organisation On g.DeveloperID Equals o.ID
        Select o

【讨论】:

太棒了——谢谢。我从来没有想过将 Linq 与 Lambda 混合使用。这开辟了一个全新的可能性世界!我已将 vb.net 代码放入我的 OP 中。

以上是关于在比较器包含 DbNull 的强类型数据集上的 Linq JOIN 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

表 Y 中 X 列的值为 DBNull

如何使用任何 t 检验比较数据集上的分类器?

不平衡数据集上的一类文本分类

OracleParameter 和 DBNull.Value

在 VB.NET 中避免 DBNull?

如何测试任何数据类型的DBNull?