代码之家  ›  专栏  ›  技术社区  ›  mattruma

如何使用LINQ搜索varchar字段以构建建议列表

  •  1
  • mattruma  · 技术社区  · 16 年前

    我正在尝试使用表达式树构造一个LINQ查询,以执行以下操作:

    我在itemcode表中有一个名为labels的字段,该字段中包含的数据示例是“灯具照明枝形吊灯”。

    我希望允许用户输入一些文本,即“红灯”,并能够搜索项目代码、文本包含“红灯”或“灯”的表格的标签字段。

    我尝试向用户推荐选择,这虽然是基本的,但却是一个很好的第一步…只需要一些构造查询的帮助。

    我使用CSLA作为我的框架,下面是我目前拥有的代码示例:

    IQueryable<Data.ItemCode> query = ctx.DataContext.ItemCodes;
    
    //
    // ItemCodeId
    //
    if (criteria.Name != null)
         query = query.Where(row => row.ItemCodeId.Contains(criteria.ItemCodeId));
    //
    // Name
    //
    if (criteria.Name != null)
         query = query.Where(row => row.Name.Contains(criteria.Name));
    
    var data = query.Select(row => ItemCodeInfo.FetchItemCodeInfo(row));
    
    this.AddRange(data);
    

    事先谢谢!

    4 回复  |  直到 15 年前
        2
  •  1
  •   Tom H zenazn    15 年前

    编辑:更新以反映示例代码

    假设您的Criteria对象有一个名为Labels的字段,该字段是搜索字符串(例如“红灯”),那么:

    var rows = query.ToList() // work around for local sequences error
               .Where(row => row.Labels.Split(' ')
                             .Intersect(Criteria.Labels.Split(' '))
                             .Count()>0);
    this.AddRange(rows);
    

    这将选择标签字段包含条件搜索字符串中任何单词的行。它假定单词在标签字段和条件字符串中由空格分隔。它不会进行部分单词匹配,例如,如果提供的搜索字符串是“红灯”,它将找不到标签为“红灯”的记录。

        3
  •  0
  •   Daniel Brückner    16 年前
    String searchString = "red LAMP";
    
    String[] searchStringParts = searchString.
       ToUpperInvariant().
       Split(new Char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    
    IEnumerable<ItemCode> resultSet = itemCodes.
       Where(itemCode => searchStringParts.
          Any(part => itemCode.Labels.ToUpperInvariant().Contains(part)));
    

    这将与Linq To对象一起使用。可能不与Linq to SQL一起使用,因为 ToUpperInvariant() 呼叫。在这种情况下,您可以省略规范化(导致搜索质量不佳)或存储规范化的标签。或者您可以添加 ToList() 调用、获取所有项并在客户机上进行处理。

        4
  •  0
  •   mattruma    15 年前

    我们决定使用存储过程路径来实现这个高级功能。感谢大家的投入!