【问题标题】:Searching any word using Linq使用 Linq 搜索任何单词
【发布时间】:2018-01-12 13:56:10
【问题描述】:

在我的 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();

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

谢谢

【问题讨论】:

  • 也许你可以只使用一个 IndexOf != -1
  • 您可以根据您的 txtSearchTerm 构建一个正则表达式并使用它来匹配目标字符串。 .*(100|Ml|Aftershave).* 将匹配“Adidas aftershave 100Ml”
  • Contains 将涵盖StartsWith 和EndsWith 两种情况。
  • 您可以考虑使用数据库的原生“全文搜索”功能。例如。 Oracle 有Oracle Text,显然 MS SQL 也有类似的东西。
  • 好主意,如果我在 MSSQL 中启用全文索引,不知道如何在 linq 中使用它。

标签: c# performance linq search


【解决方案1】:

好吧,您正在测试描述是否开始、结束并包含某些内容。前两个已经是多余的,因为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()

【讨论】:

  • 不确定单词列表的排序会有什么帮助,因为这似乎是 EF,因此无论如何都会被翻译成 SQL。
【解决方案2】:

您可以立即改进的一件事是删除 StartsWith 和 EndsWith ,因为您已经在做 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2016-02-16
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多