【发布时间】:2016-11-10 06:14:03
【问题描述】:
我在构建高效的搜索查询时遇到了噩梦。我正在使用 LINQ。要求如下:
在应用程序中有一个文本狐狸字段,用作快速搜索。
我要搜索的表包含三个字段Make、Model和Extension。
用户可以输入的典型关键字如 Honda Accord XL
根据关键字,数据库应该返回匹配的行,问题就从这里开始了。没有限制输入关键字的顺序来准备短语,即可以输入Accord XL Honda,也可以像XL Accord,也可以只是本田。在示例中,Honda 是 Make,Accord 是 Model,XL 是扩展。
理想情况下,搜索结果应该只提取完美匹配,例如如果输入了 Honda Accord,则不会显示 Honda 的其他车型。但主要问题是我不知道他们会输入什么,我必须使用Contains 运算符查看表格的三个不同列。
这是我尝试过的:
我将短语吐出单词并将它们放在一个数组中
var arr = keyWord.Split(new [] {' '})。下一步我在这些数组元素的循环中构建查询:
foreach (var k in arr)
{
var item = new Vehicle();
var arrayItem = k;
var query = DataContext.Vehicles.Where(v =>v.RealName.Contains(arrayItem)
|| v.Model.Contains(arrayItem)
|| v.Style.Contains(arrayItem)).ToList();
foreach (var v in query)
{
if(!result.Contains(v))
result.Add(v);
}
}
return result;
现在,当循环正在执行并匹配 Make 的记录时,它已经用 250 个项目填充了列表。但是,当记录以 CT 作为模型或以 TYL 作为扩展名时,如何删除不需要的项目?如果我知道创建关键字的单词的顺序,那么我可以选择使用一行代码从列表中删除不匹配的 Make、Model 或 Extension 并返回最终结果。但在这种情况下,如果我必须这样做,我再次必须使用循环并删除不匹配的项目,即使这样也可能不会给我正确的数据。这绝对不是执行此操作的有效方法。
【问题讨论】:
-
如果用户输入了三个单词(假设我们将
XL算作一个单词),您是否只想返回匹配所有三个单词的结果?如果是这样,这听起来像是一个relational division问题,如果你纯粹在 SQL 中做的话。 -
您介意再解释一下吗?
-
这是哪个 SQL 提供程序? (LINQ-to-SQL,实体框架,...)
标签: c# sql-server asp.net-mvc linq