寻求SQL server查询使用组合关键字搜索表的多列的帮助

本文关键字:搜索表 帮助 关键字 组合 server SQL 查询 寻求 | 更新日期: 2023-09-27 18:17:08

我有一个噩梦在建立一个高效的搜索查询。我正在使用LINQ。要求如下:

在应用程序中有一个文本狐狸字段,用作快速搜索

我要搜索的表包含三个字段MakeModelExtension

用户可以输入的典型关键字如下: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从列表中使用一行代码为每个并返回最终结果。但在这种情况下,如果我必须这样做,我必须再次使用循环并删除不匹配的项,即使这样也可能不会给我正确的数据。这显然不是有效的方法

寻求SQL server查询使用组合关键字搜索表的多列的帮助

—尝试使用下面的方式,你的代码首先检索各自的数据库------,然后过滤得到以前的结果。

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从视图

中获取记录sql

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

您需要的是:RealNameModelStyle中包含所有关键字的所有车辆。这可以通过以下命令实现:

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

这不是运行查询最有效的方式。当关键字的数量变得"大"时,它会变得相当慢。但我认为这不是问题。