Linq vb.net:在DataRow []中查找项目

时间:2011-09-28 08:41:53

标签: vb.net linq datarow

gefundeneID = drTerminal.AsEnumerable().Single(Function(s) s("TerminalID") = RandomID)

拥有一个DataRow数组,并希望查看RandomID是否在其中一行中。

这段代码出了什么问题?

编辑: 出现此错误:未为DBNull和Integer

定义operator =

3 个答案:

答案 0 :(得分:1)

显然,您的代码无法将TerminalID(可以是DBNull)与整数RandomID进行比较。您可以通过访问TerminalID来避免此问题,如下所示:

...(Function(s) s.Field(Of Integer?)("TerminalID") = RandomID)

DataRow.Field提供对数据字段的强类型访问,并且当与可空类型(例如Integer?)一起使用时,会自动将DBNull转换为Nothing。由于Integer?(您的字段)和Integer(RandomID)可以与=进行比较,因此上述代码应该可以正常使用。

作为旁注:我建议打开Option Strict,这样可以避免在整个地方使用大量隐式转换,并鼓励良好的编码风格。 (是的,打开电源后会出现很多编译错误,但这是有正当理由的...提高代码质量。使用Option Strict On,您的代码示例甚至不会编译。)

答案 1 :(得分:1)

如果要检查ID是否在您的集合中,请不要使用Single,因为如果找不到匹配项将引发异常。如果您只想在找到匹配项时返回true或false,请使用.Any。如果要返回找到的结果,请考虑SingleOrDefault(如果您知道只能有0-1匹配)或FirstOrDefault,如果您可能返回多个匹配项。

@ Heinzi关于字段可空性和Option Strict的评论也值得考虑。

答案 2 :(得分:0)

尝试以下功能:

Private Function ItemAdded(UserID As String) As Boolean
        Return (tbl.Select(String.Format("UserID ='{0}'", UserID)).Count > 0)
End Function