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

时间:2018-03-02 21:01:49

标签: c# .net linq linq-to-entities

我有一张Somethings表。那些Somethings有一个Name字段。我网站的用户可以输入该名称的前向或后向组合,我需要返回正确的内容。

示例:

用户输入:“命名为”。

我有一个Something.Name的“名字”。

我退回那个东西。

现在,SQL看起来像这样:

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

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

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));

你可以清楚地看到那里明显的缺陷,因为在这个查询中,一个名为“Something的名字”的东西将不匹配,因为该名称不包含在用户输入的代码片段中“名字”。

那么我如何编写Linq to Entities查询以获取所有可能的Somethings,其中用户输入的代码片段的任何排列都包含在Something of the Something中?

1 个答案:

答案 0 :(得分:1)

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

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)));
}