【发布时间】: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