【问题标题】:Linq vb.net: Find Item in DataRow[]Linq vb.net:在 DataRow [] 中查找项目
【发布时间】:2011-09-28 08:41:52
【问题描述】:
gefundeneID = drTerminal.AsEnumerable().Single(Function(s) s("TerminalID") = RandomID)

有一个 DataRow 数组并想查看 RandomID 是否在其中一行中。

这段代码有什么问题?

编辑: 收到此错误:未为 DBNull 和 Integer 定义运算符 =

【问题讨论】:

  • 投票关闭,因为您没有描述当前代码有什么问题。 (它是否返回错误的结果?它是否抛出异常?如果是,是哪一个?)在目前的形式中,这个问题只能通过猜测来回答。

标签: vb.net linq datarow


【解决方案1】:

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

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

DataRow.Field 提供对数据字段的强类型访问,并且在与可空类型(例如 Integer?)一起使用时,自动将 DBNulls 转换为 Nothing。由于Integer?(您的字段)和Integer(随机ID)可以与=进行比较,所以上面的代码应该可以正常工作。

作为旁注:我建议打开Option Strict,这样可以避免到处使用大量隐式转换并鼓励良好的编码风格。 (是的,打开它后你会得到很多编译错误,但这是有充分理由的......为了提高代码的质量。使用 Option Strict On,你的代码示例甚至不会编译。)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      尝试以下功能:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-23
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多