在我的应用程序中,我有一个搜索查询文本框(txtSearch),它适用于带有以下LINQ的单字查询:
slstFilteredItems = From s In slstItems _
Where s.strText.IndexOf(txtSearch.Text, StringComparison.OrdinalIgnoreCase) >= 0 _
Select s
但如果您使用多字查询进行搜索,请说“创建客户”(无引号),它只会找到包含结果“创建客户”的结果(不区分大小写)。
因此,我能想到的最简单的处理方法是使用一个查询,按顺序对每个单词执行.Intersect,如下所示:
slstFilteredItems = (From s In slstItems _
Where s.strText.IndexOf(txtSearch.Text.Split(" ")(0), StringComparison.OrdinalIgnoreCase) >= 0 _
Select s).Intersect _
(From s In slstItems _
Where s.strText.IndexOf(txtSearch.Text.Split(" ")(1), StringComparison.OrdinalIgnoreCase) >= 0 _
Select s)
'And so on...
那么我如何使上述查询更通用(即:能够处理查询中的任意数量的单词)?
我应该注意,被查询的对象是从Access数据库中提取的字符串列表。就目前而言,这个应用程序只查询数据库一次,如果可能的话我想保持这种方式。
答案 0 :(得分:1)
这是一种可能的方法:
Dim words = "Dog cAt biRD"
Dim slstItems = New String() { "dog thing cat bird ", "bird cat", "cat foo dog bird " }
'Query Syntax (with some fluent syntax)
Dim q = From s In slstItems.Select(Function(x) x.ToLower())
Where words.Split(" ").Select(Function(x) x.ToLower()).All(Function(x) s.Contains(x))
Select s
'All Fluent Syntax
slstItems.Select(Function(x) x.ToLower()) _
.Where(Function(s) words.Split(" ").Select(Function(x) x.ToLower()) _
.All(Function(w) s.Contains(w)) _
)
两者都返回:
dog thing cat bird
cat foo dog bird
请注意,与bigtlb的答案相比,这是低效的(这是一个更好的数据库搜索解决方案)。
答案 1 :(得分:1)
这适用于txtSearch.text.Split数组中的任意数量的项目
slstFilteredItems = (From splits In txtSearch.Text.Split(" ").ToList _
From s In slstItems _
Where s.strText.IndexOf(splits, StringComparison.OrdinalIgnoreCase) >= 0 _
Select s)
答案 2 :(得分:0)
如果您正在访问SQL Server数据库,则全文搜索可能是更好的方法。