Vb.net 当我知道列名和行ID时,如何在不循环的情况下获取datatable的字段?

Vb.net 当我知道列名和行ID时,如何在不循环的情况下获取datatable的字段?,vb.net,datatable,dataset,datatables,Vb.net,Datatable,Dataset,Datatables,当我知道列名和行ID时,如何在不循环的情况下获取datatable的字段 比如,;我想要当地区=城市,产品=乐高时的“总销售额”。这是我长期以来一直在努力解决的问题,可能是因为我认为在SQL中,始终循环遍历所有内容似乎并不总是正确的方式。但是,如果我只是需要学习像一个VB开发人员一样思考,并且总是循环从列表或表格中获取一些东西,请让我知道 我有一系列的断言比较了两个数据表,一个数据表有一行,每个单元格都有一个命名列,这些列来自SSRS生成的XML,另一个数据表有一行,每个唯一值对应一个SQL查询

当我知道列名和行ID时,如何在不循环的情况下获取datatable的字段

比如,;我想要当地区=城市,产品=乐高时的“总销售额”。这是我长期以来一直在努力解决的问题,可能是因为我认为在SQL中,始终循环遍历所有内容似乎并不总是正确的方式。但是,如果我只是需要学习像一个VB开发人员一样思考,并且总是循环从列表或表格中获取一些东西,请让我知道

我有一系列的断言比较了两个数据表,一个数据表有一行,每个单元格都有一个命名列,这些列来自SSRS生成的XML,另一个数据表有一行,每个唯一值对应一个SQL查询生成的区域

SQL实体模型数据集中的表:

Region  Prod  Total Sold
City    Legos   68
State   Legos   90
Nat.    Legos   200
City    ToyB    20
State   ToyB    30
Nat.    ToyB    40
City    ToyC    450
State   ToyC    600
Nat.    ToyC    900
从SSRS返回的XML数据集中的表:

City_Legos  State_Legos  Nat_Legos  City_ToyB  State_ToyB Nat_ToyB City_ToyC State_ToyC 
68          90           200          20           30     40       450        600
assert语句中从基于XML的datatable获取数据的部分很简单,因为只有一行索引0,我可以只命名我想要的列:

Dim xmlRow As DataRow = xmlDatatable.Rows(0)
Assert.AreEqual(“my SQL cell goes here”, xmlRow.Field(Of Integer)(“City_Legos”))
我可以为每个指定的列执行一个断言。许多列都不会被测试,它们有特定的名称,所以我不能简单地循环遍历这些列。那么,我应该在“我的SQL单元在这里”中输入什么来返回City和Legos的总销售额呢?显然,在SQL中很容易:选择销售总额前1名,其中Region=City,Prod=Legos。 我目前正在SQL数据表中循环,并测试每个单元格的条件,但这种逻辑变得非常庞大,因为我必须将每个单元格都封装在If…中,如下所示:

For Each m As DataRow In mySqlTable.Rows

If m.Field(Of String)("Prod") = "Legos" Then
    If m.Field(Of String)("Region") = "City" Then
        Assert.AreEqual(m.Field(Of Integer)("TotalSold"), xmlRow.Field(Of Integer)(“City_Legos”))
    End If
    If m.Field(Of String)("Region") = "State" Then
        Assert.AreEqual(m.Field(Of Integer)("TotalSold"), xmlRow.Field(Of Integer)(“State_Legos”))
    End If
    If m.Field(Of String)("Region") = "Nat" Then
        Assert.AreEqual(m.Field(Of Integer)("TotalSold"), xmlRow.Field(Of Integer)(“Nat_Legos”))
    End If
End If
Next
我希望我能做一些像select或LINQ或函数之类的事情? 像这样的东西会很好:

Dim result as Integer =  mySqlTable.Select.First(“Region = City and Prod = Legos“)
或:

这是一个单元测试,所以我总是知道SSRS返回的列和字段名

按列名和行标识符获取单元格一直是我一直在努力解决的问题,所以希望我能最终解决这个问题


谢谢

您可以使用Datatable计算方法。将“我的SQL单元格在此处”替换为 CIntmySqlTable.ComputeSUM[销售总额],[地区]=“城市”和[产品]=“乐高积木”
这是假设行是唯一的,没有空值。

如果您有一个元素列表,并且希望选择满足某些条件的元素,则必须搜索此列表=循环搜索,直到找到所需的元素。这是人类和计算机唯一可用的选项:VB.NET有很多快捷方式,可以以一种非常概括的方式编写循环,例如:LINQ查询,但这些都是循环。通常,当你说no循环时,你的意思是类似LINQ的东西,但只是想说明这一点。此外,LINQ不必比传统循环更高效,这取决于具体情况。@varocarbas-非常感谢。我想答案可能是你应该一直循环。我通常是这样做的,因为SSRS数据通常是表格形式的,但在这种情况下,它是单点的。当然,我仍然可以循环,但我仍然想找到singleton值。谢谢,这有助于我对VB处理数据的一般理解。与VB.NET无关;它与编程有关,而且。。。常识。如果您有一个元素列表,并且想知道元素在哪个位置;你有两个选择:幸运猜测计算机不会这样做,或者在找到想要的元素之前寻找所有元素。一种编程语言有许多奇特的东西,这一事实无法掩盖现实:最后,一切都是循环,条件通过所有元素循环,并检查是否。。。。不知道这意味着对编程有一个严肃的基本理解,你应该看看。。。。如果你是一名程序员,你就不能指望事情就这样发生——这是你应该构建的程序的用户;作为一个魔法信徒,你应该明白事情为什么会发生。如果你仔细考虑你打算做什么,你就会明白,没有一种明智的、基于魔法的方法可以在不检查列表中的元素的情况下找到元素在列表中的位置:无论如何。。。不客气。谢谢,我很感激知道什么时候我需要学习一个重要的概念。我想我可以做一些类似SQL的事情,我从来没有使用过游标循环。无论是否在后台使用SQL循环,我都不必用SQL编写循环。不管怎样,接受的答案对我当前的项目非常有效。再次感谢。好吧,那当然行了,谢谢!我试图找出一种不使用SUM的方法,而是类似于First的方法,以防出现重复行。然而,考虑到应该总是只有唯一的行,现在这个方法非常有效。那么,到底计算什么呢?它是基于魔法还是基于循环?我过去每5个断言有13行循环代码,现在我有5行代码用于5个断言,从而减少了8行代码。乘以我需要测试的16组数据,我就保存了
d 128行代码。不过,很高兴知道它在内存中仍在循环。@BClaydon您认为LINQ是用来做什么的?为关心的人而不是我自己减少代码的大小。但是,这不能让你认为现在事情更快了:不管怎样,循环都完成了,事情可能会更慢。如果你喜欢这个选项,那就太好了;但你的问题澄清了一个令人担忧的问题:没有循环,你无法分析任何收集。
Assert.AreEqual(mySqlTable.Select.First(“Region = City and Prod = Legos“), xmlRow.Field(Of Integer)(“City_Legos”))