【发布时间】: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