如果我知道列名和行ID,如何在不循环的情况下获取数据表的字段?
例如;当Region = City和Product = Legos时,我想要“Total Sold”值。这是我长期以来一直在努力的事情,可能是因为我认为在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
XML表格(从SSRS返回的数据集):
City_Legos State_Legos Nat_Legos City_ToyB State_ToyB Nat_ToyB City_ToyC State_ToyC
68 90 200 20 30 40 450 600
从基于XML的数据表获取数据的assert语句部分很简单,因为只有一行(索引0),我只能命名我想要的列:
Dim xmlRow As DataRow = xmlDatatable.Rows(0)
Assert.AreEqual(“my SQL cell goes here”, xmlRow.Field(Of Integer)(“City_Legos”))
我可以为每个指定的列做一个断言。许多列将不会被测试,并且它们具有特定的名称,因此我不能简单地遍历列。那么我应该把“我的SQL单元格”放到这里以返回城市和乐高的总销售额?显然在SQL中很容易:SELECT TOP 1 Total_Sold WHERE Region = City and 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或Function这样的事情? 这样的事情会很好:
Dim result as Integer = mySqlTable.Select.First(“Region = City and Prod = Legos“)
或者:
Assert.AreEqual(mySqlTable.Select.First(“Region = City and Prod = Legos“), xmlRow.Field(Of Integer)(“City_Legos”))
这是一个单元测试,因此我将始终知道SSRS返回的列和字段名称。
按列名和行标识符获取单元格一直是我一直在努力的事情,所以希望我终于可以解决这个问题。
谢谢!
答案 0 :(得分:0)
您可以使用Datatable Compute方法。替换(“我的SQL单元格在这里”与 CInt(mySqlTable.Compute(“SUM([Total Sold])”,“[Region] ='City'和[Prod] ='Legos'”)) 这假设行是唯一的,没有空值。