【问题标题】:Using Linq to Entities to Return Records that Match a List of Possible Strings使用 Linq to Entities 返回与可能字符串列表匹配的记录
【发布时间】:2018-03-02 21:01:48
【问题描述】:

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

例子:

用户输入:“命名”。

我有一个“名字”的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));

您可以清楚地看到那里的明显缺陷,即名称为“某物的名称”的某物在此查询中将不匹配,因为该名称未包含在用户的 sn-p 中输入“名称”。

那么,我将如何编写 Linq to Entities 查询以获取所有可能的Somethings,其中用户输入的sn-p 的任何排列都包含在Something 的名称中?

【问题讨论】:

  • 单独查找每个单词怎么样,如果它们都出现了,你就得到了匹配。
  • 这是有道理的。我该怎么写才能使查询适用于 1 到 n 个单词?

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


【解决方案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)));
}

【讨论】:

  • 此查询将命中 Something.Name = "the name" 以获取 "me he na" 输入
  • @khoroshevj 你说的完全正确。您可以将Name 分解为单词并匹配它们,但我将把它作为练习留给读者。
猜你喜欢
  • 2012-07-03
  • 2011-04-08
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多