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

使用Linq to实体返回与可能字符串列表匹配的记录

  •  1
  • crackedcornjimmy  · 技术社区  · 6 年前

    我有一桌东西。这些东西有一个名称字段。我网站的用户可以输入该名称的前向或后向组合,我需要返回正确的内容。

    例子:

    用户输入:“命名”。

    我有一件事。“名称”的名称。

    我还了一些东西。

    现在,SQL如下所示:

    SELECT * FROM Somethings
    Where Name LIKE '%name the%'
    OR Name LIKE '%the name%'
    

    如您所见,我需要获取用户输入的字符串的所有排列,然后搜索每个排列。我尝试在循环中执行此操作,使用Linq到实体,如下所示:

    var string[] arr = {"name the", "the name"};
    
    foreach (var str in arr)
    {
        var matchingSomethings = db.Somethings
                    .Where(e => e.Name.IndexOf(str , StringComparison.InvariantCultureIgnoreCase) >= 0);
    }
    

    当用户输入两个单词时,这种方法非常有效。但是,由于有五个单词(120个排列),它变得很麻烦,用户的查询也超时了。

    然后我尝试:

    var matchingSomethings = db.Somethings
                    .Where(e => arr.Contains(e.Name));
    

    您可以清楚地看到其中的明显缺陷,即具有“某物名称”名称的某物在该查询中不会匹配,因为该名称未包含在用户输入的“名称”片段中。

    那个么,我该如何编写Linq to Entities查询来获取所有可能的某物,其中用户输入的代码片段的任何排列都包含在某物的名称中?

    1 回复  |  直到 6 年前
        1
  •  1
  •   JSteward    6 年前

    逐个查找每个单词并返回包含所有匹配单词的项目。这应该可以做到:

    public void MatchSomethings(string input)
    {
        var data = new List<something>();
        var wordsInName = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        var match = data.Where(s => wordsInName.All(word => s.Name.Contains(word)));
    }