寻求SQL server查询使用组合关键字搜索表的多列的帮助
本文关键字:搜索表 帮助 关键字 组合 server SQL 查询 寻求 | 更新日期: 2023-09-27 18:17:08
我有一个噩梦在建立一个高效的搜索查询。我正在使用LINQ。要求如下:
在应用程序中有一个文本狐狸字段,用作快速搜索。
我要搜索的表包含三个字段Make、Model和Extension。
用户可以输入的典型关键字如下:Honda Accord XL
基于关键字数据库应该返回我匹配的行,这里的问题开始了。准备短语时输入关键字的顺序没有限制,即可以输入Accord XL Honda,也可以是XL Accord,也可以只是Honda。本例中Honda为Make, Accord为Model, XL为扩展名。
理想情况下,搜索结果应该只拉出完美的匹配,如如果本田雅阁输入,它不会从本田带来其他车型。但是主要的问题是我不知道它们会输入什么,我必须使用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从列表中使用一行代码为每个并返回最终结果。但在这种情况下,如果我必须这样做,我必须再次使用循环并删除不匹配的项,即使这样也可能不会给我正确的数据。这显然不是有效的方法
—尝试使用下面的方式,你的代码首先检索各自的数据库------,然后过滤得到以前的结果。
List<Vehicle> lsvehicle= new List<Vehicle()>;
foreach (var k in arr)
{
var arrayItem = k;
lsvehicle = DataContext.Vehicles.Where(v =>v.RealName.Contains(arrayItem) ).ToList();
}
foreach (var k in arr)
{
lsvehicle = lsvehicle.Where(v =>v.Model.Contains(arrayItem) || v.Style.Contains(arrayItem)).tolist();
}
return lsvehicle ;
这可以通过连接Make + Model + Extension字符串来实现,然后比较整个数组是否包含在这个字符串
中var query = DataContext.Vehicles;
foreach (var k in arr)
{
var item = new Vehicle();
var arrayItem = k;
query = query.Where(v => (v.RealName + v.Model + v.Style).Contains(arrayItem)).ToList();
}
return query;
注意:逻辑答案,如果有,可能需要语法错误纠正
假设您有在数据库中创建视图的选项,我建议采用以下方法你正在搜索三列
1)创建一个view With all combination2)使用linq从视图
中获取记录sqlcreate view [Vw_VehicleSearch]
AS
Select
M+V+E [MVE],
M+E+V [MEV],
V+M+E [VME],
v+E+M [VEM],
E+M+V [EMV],
E+V+M [EVM]
from
vehicletable
c# public List<string> Search(string quickSearchText)
{
using(var ctx=new model()))
{
var result=ctx
.Vw_VehicleSearch
.Where(v=>v.MVE.Contains(quickSearchText)
|| v=>v.MEV.Contains(quickSearchText)
.|| v=>v.VME.Contains(quickSearchText)
.|| v=>v.VEM.Contains(quickSearchText)
.|| v=>v.EMV.Contains(quickSearchText)
.|| v=>v.EVM.Contains(quickSearchText)
.ToList();
return result.Select(r=>r.MVE).ToList();
}
}
您需要的是:RealName
、Model
或Style
中包含所有关键字的所有车辆。这可以通过以下命令实现:
var query = DataContext.Vehicles.Where(v =>
arr.All(s => v.RealName.Contains(s))
|| arr.All(s => v.Model.Contains(s))
|| arr.All(s => v.Style.Contains(s)))
.ToList();
实体框架能够将这个查询转换为SQL,因为它有一个技巧,将数组arr
转换为可以在SQL语句中使用的表(各种)(您应该看看生成的SQL)。
这不是运行查询最有效的方式。当关键字的数量变得"大"时,它会变得相当慢。但我认为这不是问题。