Пользовательский поиск в DataTable - PullRequest
0 голосов
/ 14 апреля 2009

РЕДАКТИРОВАТЬ: Примечание. Я должен был упомянуть, что я не заинтересован в использовании .Select, DataRowView, RowFind и т. Д. Спасибо за эти предложения, но код, как он есть, я надеялся оптимизировать.

Я написал функцию для поиска в базе данных терминов в массиве. Затем я возвращаю datatable как набор данных, чтобы он мог быть привязан к DataGridView. У кого-нибудь есть идеи по оптимизации? Так как это поиск в реальном времени (каждый введенный термин ищет сразу), я бы хотел сделать функцию максимально быстрой. На самом деле скорость уже довольно хорошая, но я решил, что стоит спросить всех вас, могу ли я что-то изменить в этом.

  • VB.NET
  • .NET 2.0

Открытая функция SearchEngine (ByVal Terms () в виде строки, ByRef ResidentTBL в качестве DataTable) в качестве DataSet Dim newdts As New DataSet («Пользователи») Dim newtable, искушаемый как новый DataTable Dim residentPassCeiling, tempPassCeiling, termceiling As Integer residentPassCeiling = ResidentTBL.Rows.Count - 1 Termsceiling = Terms.GetUpperBound (0) newtable = ResidentTBL.Clone

        For j = 0 To termsceiling

            If j < 1 Then
                '######################## BEGIN First Pass ########################################################################
                For i = 0 To residentPassCeiling

                    If ResidentTBL.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper = Terms(j).ToUpper Then
                        'we have an excact match on account skip further additions
                        newtable.Rows.Clear()
                        newtable.ImportRow(ResidentTBL.Rows(i))
                        newdts.Tables.Add(newtable)
                        Return newdts
                    Else
                        If _
                        ResidentTBL.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.displayName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.sn - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.givenName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.l - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.department - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.telephoneNumber - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        ResidentTBL.Rows(i).Item(TheColumns.building - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Then
                            'then add to the row
                            newtable.ImportRow(ResidentTBL.Rows(i))
                        End If
                    End If

                Next i
                '######################## END First Pass ########################################################################
            Else
                '######################## BEGIN Second.. Pass(es) ########################################################################
                'Further searches we want to search the already filtered datatable from each term
                temptable = newtable.Clone
                temptable = newtable.Copy
                newtable.Clear()
                tempPassCeiling = temptable.Rows.Count - 1
                For i = 0 To tempPassCeiling

                    If temptable.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper = Terms(j).ToUpper Then
                        'we have an excact match on account skip further additions
                        newtable.Rows.Clear()
                        newtable.ImportRow(temptable.Rows(i))
                        newdts.Tables.Add(newtable)
                        Return newdts
                    Else
                        If _
                        temptable.Rows(i).Item(TheColumns.AccountName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.sn - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.givenName - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.l - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.department - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.telephoneNumber - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Or _
                        temptable.Rows(i).Item(TheColumns.building - 1).ToString.ToUpper Like Terms(j).ToUpper & "*" Then
                            'then add to the row
                            newtable.ImportRow(temptable.Rows(i))
                        End If
                    End If

                Next i

                temptable = Nothing
                '######################## END Second.. Pass(es) ########################################################################
            End If

        Next j
        newdts.Tables.Add(newtable)
        ResidentTBL = Nothing

        Return newdts
        newdts = Nothing

    End Function

Ответы [ 2 ]

2 голосов
/ 14 апреля 2009

Возможно, вы захотите использовать DataView для фильтрации ваших данных:

http://aspnet101.com/aspnet101/tutorials.aspx?id=31

0 голосов
/ 14 апреля 2009

Вы можете сгенерировать строку фильтра DataTable, чтобы выбрать строки из таблицы данных.

http://msdn.microsoft.com/en-us/library/system.data.datatable.select.aspx

Вот документы на строку фильтра

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

...