【问题标题】:Select a DataRow based on two column conditions根据两列条件选择一个 DataRow
【发布时间】:2020-02-17 01:19:17
【问题描述】:

我有一个数据表,我知道它一开始是空的,但是当我填充它时,我无法根据两列条件将数据行从其中取出,因此它的数量增加了一倍(或更多)行数。

我可能会犯这个错误,但我的目标是在满足 2 个条件时检查数据表中是否存在该行,如果存在则获取该行并对其进行修改。

Dim qryB = From drw As DataRow In oDT_Signals.Rows
           Where drw("SG").Equals(sgrp) AndAlso drw("EP").Equals(srchPt)
           Select drw

Dim rslt = qryB.SingleOrDefault

If IsNothing(rslt) Then
    ed.WriteMessage("Row does not exist")
    oDT_Signals.Rows.Add(0, 0, sgrp, rw.sPt, PtList.IndexOf(rw.sPt), rw.ePt, PtList.IndexOf(rw.ePt), "NIL", rw.Len, 0, rw.Phases, rw.Size, rw.Core, rw.Ins, rw.Temp, rw.Table, "NIL",
                            "NA", "NA", rw.mVAm, ldVal, 0, 0, rw.Zs, 0, 0, rw.ePt.X, rw.ePt.Y, rw.mVtest, 0, 0, rw.Ztest, 0, 0)

Else
    ed.WriteMessage("Row does exist")
    Dim dr As DataRow = qryB.First
    dr("LOAD") = Math.Round(ldVal + dr("LOAD"), 2, MidpointRounding.AwayFromZero)
End If

问题是 rslt 总是什么都不是,当我知道事实并非如此时。有没有人能够帮助我确定我做错了什么,总是添加行?控制台一直说“行不存在”。

【问题讨论】:

  • 请不要从代码的第一行中删除前导空格并将其保留在其余部分。它使代码更难阅读,并且很容易避免,无论是在 VS 还是在 SO 编辑器中。努力让我们尽可能轻松地为您提供帮助,其中包括使您的代码尽可能易读。
  • 如果您更喜欢查询语法,那么使用它是您的特权,但您可以使用函数语法更简洁地编写该查询。考虑到我的回答,前两行可以替换为:Dim rslt = oDT_Signals.AsEnumerable().SingleOrDefault(Function(drw) drw.Field(Of String)("SG") = sgrp AndAlso drw.Field(Of String)("EP") = srchPt)
  • 您在Else 块中使用First 比毫无意义还要糟糕。如果您在Else 块中,那么您已经知道查询匹配了一行并且rslt 已经引用了该行。第二次执行相同的查询以获得您已经拥有的同一行有什么意义?这也意味着您不需要未实现的查询以供以后使用,因此可以使用函数语法而不是查询语法,如我上面所示。
  • 我只是尽我所能获得那一排。我知道这很愚蠢,但就是想不通为什么它找不到它。我尝试了很多方法,那是宿醉。你是对的,它现在已经消失了。

标签: vb.net linq datatable datarow


【解决方案1】:

我没有测试过,但我相当肯定问题在于您使用了Object.Equals 方法,该方法将测试引用是否相等。如果您对价值平等感兴趣,请对此进行测试。改变这个:

Where drw("SG").Equals(sgrp) AndAlso drw("EP").Equals(srchPt)

到这样的事情:

Where drw.Field(Of String)("SG") = sgrp AndAlso drw.Field(Of String)("EP") = srchPt

如果列不包含Strings,请更改Field 调用的泛型类型。

【讨论】:

  • 感谢您尝试 nut 这也不起作用。我不确定你对空格问题的意思抱歉,但我会努力做得更好。无论哪种方式,我都没有得到任何 rslt ......我已经尝试过你的查询和函数语法都无济于事。
  • 在这种情况下,我建议没有匹配项。您应该暂时放弃 LINQ,只使用标准循环。然后,您可以准确地看到每行正在比较哪些值,并且您将能够准确地看到您认为应该匹配的行(如果有)以及当时正在使用的值。例如,您的 sgrp 和/或 srchPt` 变量可能不包含您认为它们所做的事情。
  • 关于空格,如果您选择从第一行的第一个字符到最后一行的最后一个字符的代码,那么您将切断第一行的前导空格并将其保留其他。只要看看,你就可以用自己的眼睛看到它。您可以通过在选择获取任意矩形块时按下 Alt 来避免这种情况,从所有行中删除空白。或者,您可以在粘贴后选择除第一行以外的所有内容,然后反复单击 代码示例 按钮以一次删除四个前导空白字符。
  • 我不确定你是否能看到它,但你可以点击上面说我编辑了你的问题的链接,以查看我所做的更改,看看为什么它现在更具可读性。跨度>
  • 你一直都是对的。 srchpt 不是我想的那样。非常感谢。
猜你喜欢
  • 2022-09-30
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
相关资源
最近更新 更多