2016-11-16 2 views
0

У меня есть класс с именем Person, который обладает свойствами FirstName, LastName и MiddleName и у меня есть форма для всей SortedDictionary (Of Integer, Person) называется oPeople.LINQ SqlMethods.Like (и .Contains) не

, я вызываю метод, который загружает список из 65 человек. Сейчас это жестко закодировано, но в конечном итоге я буду захватывать его из базы данных.

После загрузки формы, у меня есть TextBox под названием txtSearchForName для пользователя, чтобы ввести слово для поиска и имеют система просматривать oPeople фильтрации на LastName для полного или частичного совпадения (случай нечувствительным).

В конце концов, я хотел бы иметь возможность искать сравнения между FirstName, LastName и MiddleName (если таковой имеется).

На этом этапе все, что я хочу сделать, это просмотреть результаты запроса LINQ и вывести их в окно консоли.

Вот Person класс:

Public Class Person 

    Private _fnm As String = String.Empty 
    Public Property FirstName() As String 
     Get 
      Return _fnm 
     End Get 
     Set(ByVal value As String) 
      _fnm = value.Trim 
     End Set 
    End Property 

    Private _lnm As String = String.Empty 
    Public Property LastName() As String 
     Get 
      Return _lnm 
     End Get 
     Set(ByVal value As String) 
      _lnm = value.Trim 
     End Set 
    End Property 

    Private _mnm As String = String.Empty 
    Public Property MiddleName() As String 
     Get 
      Return _mnm 
     End Get 
     Set(ByVal value As String) 
      _mnm = value.Trim 
     End Set 
    End Property 

    Public Sub New() 
    End Sub 

    Public Sub New(ByVal firstName As String, 
        ByVal lastName As String, 
        Optional ByVal middleName As String = "") 

     _fnm = firstName 
     _lnm = lastName 
     _mnm = middleName 

    End Sub 

End Class 

Это метод я использую, чтобы добавить людей. Я добавляю 65 человек, но сократили код вниз:

Private Sub FillPeopleDictionary() 

    Try 

     If oPeople.Count > 0 Then oPeople.Clear() 

     Dim oNewPerson As Person = Nothing 

     oNewPerson = New Person("Scarlett", "Johansson") 
     oPeople.Add(1, oNewPerson) 

     oNewPerson = New Person("Amy", "Adams") 
     oPeople.Add(2, oNewPerson) 

     oNewPerson = New Person("Jessica", "Biel") 
     oPeople.Add(3, oNewPerson) 

    Catch ex As Exception 

     MessageBox.Show(ex.Message, "Error [FillPeopleDictionary]", MessageBoxButtons.OK, MessageBoxIcon.Error) 

    End Try 

End Sub 

Это мое заявление LINQ с последующим выходом на консоли, которая вызывается, когда пользователь нажимает на кнопку:

Dim sSearchTerm As String = txtSearchForName.Text.Trim.ToLower 

Dim queryResults = From person In oPeople 
'Where SqlMethods.Like(person.Value.LastName.ToLower, "%" & sSearchTerm & "%") 
'Where person.Value.LastName.ToLower.Contains("%" & sSearchTerm & "%") 

Console.WriteLine("search term: " & sSearchTerm & 
        Environment.NewLine & Environment.NewLine & 
        "queryResults.Count: " & queryResults.Count.ToString & 
        Environment.NewLine) 

For Each result In queryResults 

    If Not String.IsNullOrEmpty(result.Value.MiddleName) Then 

     Console.WriteLine(result.Key.ToString.PadLeft(2, "0") & ": " & result.Value.FirstName & " " & result.Value.MiddleName & " " & result.Value.LastName) 

    Else 

     Console.WriteLine(result.Key.ToString.PadLeft(2, "0") & ": " & result.Value.FirstName & " " & result.Value.LastName) 

    End If 

Next 

LINQ оператор работает так, как он есть, без каких-либо условий, поэтому он прокручивает и правильно перечисляет всех людей в коллекции oPeople.

В начале описания queryResults есть две статьи Where. Это два способа, которые я пытался отфильтровать. Один из подходов состоял в том, чтобы использовать .Contains, а другой должен был использовать .Like, однако ни один из них не работает.

Если пользователь должен был ввести «Мар», я надеюсь получить обратно список из 6 человек из списка 65 (чувствительно к регистру):

Meghan Markle
Марго Робби
Кейт Мара
Уинстэд
Мариан Ривера
Эми Смарт

Теперь, конечно, это поиск по FirstName и LastName. Прямо сейчас я просто пытаюсь заставить LastName работать. С только LastName список будет только:

Meghan Markle
Кейт Мара
Эми Смарт

Может кто-нибудь увидеть, что я делаю неправильно здесь?Или я должен отказаться от идеи использования LINQ с SortedDictionary?

+2

Почему вы используете 'SqlMethods' на общей обычной NET коллекции? Кроме того, спасибо за публикацию 130 * двойных интервалов * строк, показывающих, как вы добавили 60 некоторых людей. Большинство из нас получили идею после 2 или 3. см. [MCVE] – Plutonix

+0

Plutonix. Я использую SQLMethods только потому, что просто пытаюсь понять, как работает LINQ. Это моя первая попытка использовать его, поэтому я подумал, что лучше всего начать с чего-то, что мне комфортно (SortedDictionaries). Jinx88909 показал мне, что List (Of T) - лучший подход. –

+0

'SqlMethods' для Linq to SQL. вам не нужно его узнать о linq или методах расширения, как в ответах – Plutonix

ответ

0

Измените свой класс Person на включение PersonId и пройдите, как через oNewPerson = New Person(1, "Scarlett", "Johansson").

Изменение oPeople должно быть List(Of Person), поэтому при добавлении его будет выглядеть так: oPeople.Add(oNewPerson).

Вашего заявление LINQ будет выглядеть следующим образом:

Dim queryResults = From person In oPeople 
        Where person.FirstName.ToLower Like "*" & sSearchTerm & "*" Or 
         person.LastName.ToLower Like "*" & sSearchTerm & "*" 

Вы также хочешь изменить все остальное, как больше не с использованием словаря:

For Each result In queryResults 

    If Not String.IsNullOrEmpty(result.MiddleName) Then 

     Console.WriteLine(result.PersonId.ToString.PadLeft(2, CChar("0")) & ": " & result.FirstName & " " & result.MiddleName & " " & result.LastName) 

    Else 

     Console.WriteLine(result.PersonId.ToString.PadLeft(2, CChar("0")) & ": " & result.FirstName & " " & result.LastName) 

    End If 

Next 

Надеется, что это помогает.

+1

Это исправлено. Поскольку я пытаюсь узнать больше о LINQ, у меня есть вопрос. LINQ не работает со отсортированными словарями? Я не против использования списков (Of T) Мне просто интересно. Благодарим вас за то, что нашли время, чтобы полностью объяснить, что изменилось и предоставить код. Это очень высоко ценится. –

+0

Да, но все равно будет работать, но было бы полезно, если бы вы выбрали PersonId в классе, а не словарь, тогда вы можете ссылаться на свойство, а не на .Key для Id или .Value.FirstName. Для меня это немного чище. Рад, что он исправил проблему. – Bugs

0

Вашей второй Where пункт попытка закрыть, за исключением функции Contains есть String.Contains, которая не использует % подстановочных символов, которые используют SQL, так что вам нужно:

Dim queryResults = 
    From person In oPeople 
    Where person.Value.LastName.ToLower.Contains(sSearchTerm) 

Вы можете легко добавить проверку на FirstName с OrElse person.Value.FirstName.ToLower.Contains(sSearchTerm).

+0

Спасибо за помощь. Я пошел с ответом Jinx88909 сверху. Я включил ваше предложение OrElse. Работала отлично. Спасибо вам за помощь. –

0

Измените свой Linq запрос будет следующим образом:

Dim queryResults = From p In oPeople 
           Where p.Value.FirstName.ToLower.Contains(sSearchTerm) Or p.Value.LastName.ToLower.Contains(sSearchTerm) 
+0

Я пробовал это, но он все равно не дал мне никаких результатов. Я не уверен, что я сделал не так. Я закончил с ответом Jinx88909 сверху. Спасибо, что нашли время. Это очень высоко ценится. –

Смежные вопросы