首页 > 解决方案 > EF LINQ 使用多个值跨多个字段进行搜索,但它们都必须至少出现一次

问题描述

我想建立一个搜索,它允许我想在多个字段中匹配多个单独的搜索关键字(每个通过ContainsLIKE)。我还想保证返回的每条记录都包含所有搜索关键字,而不仅仅是其中的一些。

示例表:

# | 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 兼容?

标签: c#entity-frameworklinq-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();


推荐阅读