c# - EF LINQ 使用多个值跨多个字段进行搜索,但它们都必须至少出现一次
问题描述
我想建立一个搜索,它允许我想在多个字段中匹配多个单独的搜索关键字(每个通过Contains或LIKE)。我还想保证返回的每条记录都包含所有搜索关键字,而不仅仅是其中的一些。
示例表:
# | Color | Animal | Car Brand
1 | Orange | Gorilla | Citroen
2 | Blue | Cat | Skoda
3 | Red | Antilope | Ford
4 | Orange | Cat | BMW
5 | Grey | Antilope | BMW
6 | Purple | Gorilla | Lada
示例搜索:
"Orange Gorilla" returns record 1.
"Orange BMW" returns record 4.
"Orange" returns records 1 and 4.
"Cat" returns records 2 and 4.
"Ford Antilope" returns record 3.
如果我只是执行常规的 Contains-OR 查找,如下所示:
foreach (string searchterm in searchterms)
color.Contains(searchterm) || animal.Contains(searchterm) || car.Contains(searchterm)
thenOrange Gorilla
将返回记录 1、4 和 6 而不是仅记录 1,因为记录 4 还包含“Orange”(但不是 Gorilla),而记录 6 也包含“Gorilla”(但不是 Orange)。
关于最有效的实现的想法,即 EF/LINQ-to-SQL 兼容?
解决方案
虽然这有点脏而且不是那么动态,但这将适用于您显示的条件/表格结构。
搜索时的空格,3 列查找,应匹配所有条件
var searchTerm = //user input;
var countSearch = searchTerm.Split().Count(); //splits the search and count how many
var query = tables.AsQueryable();
if (countSearch == 1) // searchTerm will check any rows
{
query = query.Where(a =>
searchTerm.Contains(a.Color) ||
searchTerm.Contains(a.Animal) ||
searchTerm.Contains(a.CarBrand));
}
else if (countSearch == 2) //searchTerm will check at least two combinations on rows
{
query = query.Where(a => (searchTerm.Contains(a.Color) && searchTerm.Contains(a.Animal))
|| (searchTerm.Contains(a.Color) && searchTerm.Contains(a.CarBrand))
|| (searchTerm.Contains(a.Animal) && searchTerm.Contains(a.CarBrand)));
}
else if (countSearch == 3) //searchTern will check all rows
{
query = query.Where(a =>
searchTerm.Contains(a.Color) &&
searchTerm.Contains(a.Animal) &&
searchTerm.Contains(a.CarBrand));
}
var results = query.ToList();
推荐阅读
- python - 从用户输入生成数据集
- r - 如何找到具有因子和 NA 的 R 数据集
- python - 如何使用从登录视图中获得的 jwt 令牌进行身份验证
- input - 如何在 Gnuplot 脚本执行期间读取用户键盘输入?
- javascript - 如果句子参数包含 searchValue 参数,则返回 searchValue 开始的索引 --> 错误
- node.js - Node.js C++ 插件:如何在 Node.js 10 中通过 N-API 和 V8 创建 JS Date 对象
- c++ - 如何将函数分配给函数指针?
- php - 如何检查 Artisan::call 是否完成以及是否为 true 调用另一个函数
- r - 在使用 rvest 抓取 html 表时提取列表的第一个元素
- php - 在 for 循环中更新查询