我有一个名为Person
类,其具有的属性FirstName
,LastName
和MiddleName
和我有一个表格宽SortedDictionary(整数,人)称为oPeople
。LINQ SqlMethods.Like(和。载)失败
在上,我调用了一个加载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
,但都不起作用。
如果该用户输入“月”,我希望从65(不区分大小写)列表中取回的6人名单:
梅根马克尔
玛格特·罗比
凯特马拉
玛丽·伊丽莎白·文斯蒂德
玛丽安里维拉
艾米智能
现在当然即在FirstName
和LastName
上搜索。现在我只是想让LastName
工作。在只有LastName
名单就只能是:
梅根马克尔
凯特·玛拉
艾米智能
有人能看到我在做什么错在这里?或者我应该废除与SortedDictionary一起使用LINQ的想法?
?此外,感谢您发布130 *双行*显示您如何添加60个人。我们大多数人会在2或3之后得到想法。请参阅[MCVE] – Plutonix
Plutonix - 我只使用SQLMethods,因为我只是想了解LINQ如何工作。这是我第一次尝试使用它,所以我认为最好从我感到舒服的一些东西开始(SortedDictionaries)。 Jinx88909向我展示了List(Of T)是一个更好的方法。 –
'SqlMethods'适用于Linq to SQL。你不需要它来了解linq或扩展方法,如答案 – Plutonix