0

我的网页上有一个“超级搜索”选项。这只是在多个属性中搜索匹配项。随着时间的推移,它已经从简单的精确文本匹配发展到以任何顺序检查单个单词,并将下划线(如空格)和多个空格(如单个空格)处理,现在它真的是一团糟,不能满足所有情况!

当前 Linq 过滤代码:

private List<StockRecordItem> GetCoreSearchResults()
{
    //strip multiple spaces
    string searchString = Regex.Replace(uxTxtSuperSearch.Text.Trim(), " +", " ");


    List<StockRecordItem> stocks = StoresPortalDataAccessHelper.GetAllStockRecords(uxLocation.SelectedValue)
    //Check no super search provided
    .Where(s => 
        (string.IsNullOrEmpty(searchString)
        || (
                // Check Stock description - treating underscores and ampersands as spaces
                searchString.ToLower().Split().All(w => s.Description.ToLower().Replace(",", " ").Replace("_", " ").Replace("&", " ").Replace("-", " ").Split().Contains(w))

                // Check Stock Notes - treating underscores and ampersands as spaces
                || (s.Notes != null && searchString.ToLower().Split().All(w => s.Notes.ToLower().Replace(",", " ").Replace("_", " ").Replace("&", " ").Replace("-", " ").Split().Contains(w)))

                // Check other single word fields
                || s.StockId.Contains(searchString, StringComparison.OrdinalIgnoreCase)
                || s.Description.Contains(searchString, StringComparison.OrdinalIgnoreCase)
                || s.Notes.Contains(searchString, StringComparison.OrdinalIgnoreCase)
                || s.Warehouse.Contains(searchString, StringComparison.OrdinalIgnoreCase)
                || s.IsRestricted.ToString().Contains(searchString.ToLower().Replace("yes", "True").Replace("no", "False"), StringComparison.OrdinalIgnoreCase)
                || (!string.IsNullOrEmpty(s.Manufacturer) && s.Manufacturer.Contains(searchString, StringComparison.OrdinalIgnoreCase))
                || s.RelatedEquipments.Any(e => e.EquipmentNumber.Contains(searchString, StringComparison.OrdinalIgnoreCase))
                || s.RelatedEquipments.Any(e => e.EquipmentId.Contains(searchString, StringComparison.OrdinalIgnoreCase)))
        )

        // Part Number filter
        && (string.IsNullOrEmpty(uxTxtPartNumber.Text) || s.PartNumber.Contains(uxTxtPartNumber.Text, StringComparison.OrdinalIgnoreCase))

        // Warehouse filter
        && (string.IsNullOrEmpty(uxWarehouse.SelectedItem.Text) || s.Warehouse.Contains(uxWarehouse.SelectedItem.Text, StringComparison.OrdinalIgnoreCase))
        )
    .ToList();

    return stocks;
}

所需功能:

  • 搜索完全匹配
  • 不区分大小写
  • 多个空格被视为单个空格
  • 下划线和 & 符号被视为单个空格
  • 'MySearchString' 将匹配 'MySearchString 记录项' 或 'MySearchString'
  • “我的搜索字符串”将匹配“字符串搜索我的”或这些单词的任何其他组合。(注意:这不匹配“字符串搜索”,每个单词都必须存在)
  • 还有什么我可能没有提到的搜索解决方案中的好习惯吗?

问题:

  1. 如何清理上述代码以提高可读性/性能?
  2. 如何添加通配符选项。即搜索字符串 'My%Item' 返回 'my item' 和 'myItem'
4

0 回答 0