Linq - список фильтров - PullRequest
       25

Linq - список фильтров

0 голосов
/ 26 сентября 2018

Я создаю простой инструмент поиска в приложении Windows vb.net формы с базой данных сервера SQL, пользователь введет уникальный идентификатор и увидит результаты, которые показывают состояние.

Класс объекта:

            Public Class IStatus
                    Public Property Id As String
                    Public Property Status As String

                    Public Sub New(ByVal Id As String, ByVal Status As String)
                        Id = Id
                        Status = Status            
                    End Sub
            End Class

Что я делаю, так это заполняю строки из базы данных в List (Of IStatus). Теперь я хочу отфильтровать строки, используя linq из таблицы данных, поэтому я сделал следующее:

            Public Function GetDS() As List(Of IStatus)
                    Dim sRows As New List(Of IStatus)
                    Dim dr As SqlDataReader = GetDataReader()
                    If dr.HasRows Then
                        Using dt As New DataTable
                            dt.Load(dr)
                            totRows = dt.Rows.Count
                            If (totRows > 1) Then
                                For Each drow As DataRow In dt.Rows
                                    Dim sRow As New IStatus(drow(0).ToString(), drow(1).ToString())
                                    sRows.Add(sRow)
                                Next

                                'Trying to filter the data with linq conditions here ... 
                                Dim uniqRows = sRows.Where(Function(p) p.Status = "Open" Or p.Status = "Closed" Or p.Status = "Unknown").ToList
                                sRows = uniqRows.ToList
                            Else
                                Dim sRow As New IStatus(dt.Rows(0)(0).ToString, dt.Rows(0)(1).ToString)
                                sRows.Add(sRow)
                            End If
                            Return sRows
                        End Using
                    End If
            End Function

У меня есть список следующего объекта:

IStatus
-----------
Id
Status

Ниже приведены примерные данные и фильтрация, к которой я стремлюсь:

Например, данные:

-----------------
Id           Status
-----------------
1            Open
1            Open
1            Closed

Возвращать все строки, поскольку одно из значений статуса отличается.

Id           Status
-----------------
1            Open
1            Open
1            Open

Возвращает только первую строку, так как все значения состояния одинаковы.

Id           Status
-----------------
1            Unknown
1            Open
1            Open

Возвращает строку Неизвестно, если какой-либо из статусов Неизвестен.

Спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

вы можете использовать функцию findall для фильтрации общего списка

Public Class IStatus
    Public Property Id As String
    Public Property Status As String

    Public Sub New(ByVal Id_ As String, ByVal Status_ As String)
        Id = Id_
        Status = Status_
    End Sub
End Class
Function Createlist() As List(Of IStatus)
    Dim L1 = New List(Of IStatus)()
    L1.Add(New IStatus("1", "open"))
    L1.Add(New IStatus("1", "open"))
    L1.Add(New IStatus("1", "closed"))
    L1.Add(New IStatus("1", "closed"))
    L1.Add(New IStatus("1", "closed"))
    L1.Add(New IStatus("2", "open"))
    L1.Add(New IStatus("2", "open"))
    L1.Add(New IStatus("2", "closed"))
    L1.Add(New IStatus("2", "closed"))
    L1.Add(New IStatus("2", "closed"))
    Return L1
End Function
Sub main()
    Dim l1 = Createlist().FindAll(Function(x As IStatus) x.Id = "1")
    For Each ii In l1
        With ii
            Console.WriteLine(.Id & "- " & .Status)
        End With

    Next
    Stop
End Sub
...