我有课程:
Public Class Data
Public Property ColumnList As List(Of Column)
Public Property RowList As List(Of Row)
End Class
Public Class Row
Public Property CellList As List(Of Cell)
End Class
Public Class Column
Public Property name As String
End Class
Public Class Cell
Public Property value As Object
Public Property col As Column
End Class
然后我想检查列名列表是否是数据的主键(如SQL),例如
ColumnFieldNames = {"FieldA", "FieldB"}
ColumnList
包含名为Column
,FieldA
,FieldB
的3个FieldC
。
RowList
包含3 CellList
个,每个FieldA
填充FieldB
,FieldC
,Column
的值以及对Data.ColumnList(0).name = "FieldA"
Data.ColumnList(1).name = "FieldB"
data.RowList(0).CellList(0).value = 1
data.RowList(0).CellList(0).column = ColumnList(0)
data.RowList(0).CellList(1).value = 2
data.RowList(0).CellList(1).column = ColumnList(1)
data.RowList(1).CellList(0).value = 34
data.RowList(1).CellList(0).column = ColumnList(0)
data.RowList(1).CellList(1).value = 2
data.RowList(1).CellList(1).column = ColumnList(1)
的引用。
group by ... having count(*) > 1
等
我喜欢某种select count(1)
或FieldB
- 声明如果我选择ColumnFieldNames
作为CellList.value = 2
它会返回一些内容,因为有多行包含ColumnFieldNames
。如果我选择{" FieldA"," FieldB"}作为name: cardholder name
address_line1: billing address line 1
address_line2: billing address line 2
address_city: billing address city
address_state: billing address state
address_zip: billing postal code as a string (e.g., "94301")
address_country: billing address
,它将不返回任何内容。
答案 0 :(得分:1)
你好像在这里重新发明轮子。 DataTable类已经可以处理你的类结构并支持像过滤器表达式这样的sql。对于分组,请尝试查看以下帖子: Efficient DataTable Group By
答案 1 :(得分:1)
我认为主要目标是检查一组字段是否可能代表数据结构的主键。换句话说,如果一组字段可以唯一地标识一行。
正如FloatingKiwi指出的那样,你最好使用DataTable
类。它为您提供了许多方便的实用程序来存储和操作您的数据。您的问题可以通过这个简单的代码来回答:
Private Function IsPK_DataTable(data As DataTable, ParamArray fields As String()) As Boolean
Return New DataView(data).ToTable(True, fields).Rows.Count = data.Rows.Count
End Function
此处数据首先包含DataView
对象,该对象允许我们仅从我们的数据表(使用ToTable(..., fields)
)中选择所选列,并且只选择这些所选列唯一的行(通过将True
作为第一个参数传递给ToTable()
)。现在,如果resultign行计数与初始行计数匹配,则传递的字段集可能是我们数据的主键。
完整的演示代码可在此处找到:https://dotnetfiddle.net/6fhMgv
如果您仍然倾向于使用自定义数据结构表示,则相应的主键检查功能可能如下所示:
Private Function IsPK_CustomData(data As Data, ParamArray fields As String()) As Boolean
Dim keyValues = data.RowList _
.[Select](Function(r) r.CellList.Where(Function(c) fields.Contains(c.col.name)) _
.[Select](Function(c) c.value).ToArray()).ToArray()
For i As Integer = 1 To keyValues.Length - 1
For j As Integer = i - 1 To 0 Step -1
If keyValues(i).SequenceEqual(keyValues(j)) Then
Return False
End If
Next
Next
Return True
End Function