LINQ动态列表

时间:2016-08-09 17:00:14

标签: vb.net linq list

我有课程:

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包含名为ColumnFieldAFieldB的3个FieldCRowList包含3 CellList个,每个FieldA填充FieldBFieldCColumn的值以及对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 ,它将不返回任何内容。

2 个答案:

答案 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

完整演示:https://dotnetfiddle.net/RDl5Nl