如何遍历string.Split()数组,将每个项目的LINQ查询结果连接在一起?

时间:2011-02-03 16:12:22

标签: vb.net linq

在我的应用程序中,我有一个搜索查询文本框(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数据库中提取的字符串列表。就目前而言,这个应用程序只查询数据库一次,如果可能的话我想保持这种方式。

3 个答案:

答案 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数据库,则全文搜索可能是更好的方法。

http://msdn.microsoft.com/en-us/library/ms142571.aspx