使用Linq搜索任何单词

时间:2018-01-12 13:56:11

标签: c# performance linq search

在我的winform应用程序中,我有一个表单,用户可以通过在搜索字段中键入任何文本来搜索产品。例如,产品说明可能会存储为"Adidas aftershave 100Ml"。但是用户可以键入100 Ml Aftershave之类的任何内容。所以我想使用linq来查询描述中包含任何这些单词的所有记录(100 Ml Aftershave)。

到目前为止,我做过类似的事情:

List<string>txtList =  txtSearchTerm.Text.Split(' ').ToList();
return dbContext.productRepo.Where(t => txtList.Any(b =>
                   t.ProductDescription.StartsWith(b)
                   || t.ProductDescription.EndsWith(b)
                   || t.ProductDescription.Contains(b)

                 )).Select(x => x.ProductDescription).ToList();

以更好的方式实现这一目标的任何其他方式,使其更快或任何其他改进。

由于

2 个答案:

答案 0 :(得分:2)

嗯,您正在测试描述是否开始,结束并包含某些内容。前两个已经是多余的,因为Contains“包含”它们:

var matchingDescriptions = dbContext.productRepo
    .Where(x => txtList.Any(x.ProductDescription.Contains))
    .Select(x => x.ProductDescription));

另一个简单的优化(对于Linq-To-Objects),我会先按长度排序:

var txtList = txtSearchTerm.Text.Split(' ').OrderBy(s => s.Length).ToList()

答案 1 :(得分:2)

您可以立即改进的一件事是删除StartsWithEndsWith,因为您已经在做t.ProductDescription.Contains(b)

List<string>txtList =  txtSearchTerm.Text.Split(' ').ToList();
       return dbContext.productRepo.Where(t => txtList.Any(b =>                 
               t.ProductDescription.Contains(b)
             )).Select(x => x.ProductDescription).ToList();