#c# #linq-to-sql #search
#c# #linq-to-sql #Поиск
Вопрос:
У меня ситуация, когда у меня есть столбец ключевых слов в таблице, который содержит ключевые слова, разделенные запятыми. Пользователь может указать несколько поисковых запросов для поиска по столбцу ключевых слов. Например, пользователь предоставляет следующие условия поиска «один, два, три», а столбец db может содержать любой из «один», «два», «три» или ни один из них. как я могу написать запрос, который соответствует любому из предоставленных поисковых запросов.
Я пробовал следующее
string[] searchTerm = {"one","two","three"};
query =Product.Where( p=> searchTerm.Any(val => p.Keywords.Contains(val)));
и
var query=db.Products;
foreach (string searchword in searchTerm)
{
query = query.Where(c => c.Keywords.Contains(searchword ));
}
но у меня это не работает.
Спасибо,
Комментарии:
1. Ну, ваша база данных спроектирована неправильно. У вас никогда не должно быть столбца, содержащего список, в любом формате. Вы должны создать новую таблицу, содержащую ключевые слова и имеющую внешний ключ к исходной таблице.
Ответ №1:
Если вы разделите текст, предоставленный пользователем, по разным ключевым словам, как при преобразовании «один, два», три» в строку [], вы могли бы сделать что-то вроде:
string [] keys = keywords.Split(',');
var query = new List<Product>();
foreach (var item in keys)
{
query = query.Concat ((IEnumerable<Product>)Product.Where(x=>x.KeyWords.Contains(item))).ToList();
}
Пример:
List<Product> ass = new List<Product>();
Product a = new Product();
a.KeyWords = "one, two, three";
Product a1 = new Product();
a1.KeyWords = "one, three";
Product a2 = new Product();
a2.KeyWords = "five";
ass.Add(a);
ass.Add(a1);
ass.Add(a2);
string userInput = "one, seven";
string [] keys = userInput.Split(',');
var query = new List<Product>();
foreach (var item in keys)
{
query = query.Concat ((IEnumerable<Product>)ass.Where(x=>x.KeyWords.Contains(item))).ToList();
}
foreach (var item in query )
{
Console.WriteLine(item.KeyWords);
}
С принтами:
one, two, three
one, three
Комментарии:
1. Спасибо lcarus…it полезно, но все же для меня это соответствует запросу, который должен быть ORing…so это работает, если пользователь вводит один, два, три, но терпит неудачу, если пользователь вводит один, девять, одиннадцать
2. @user784552 Приведенный мной пример — это ИЛИ, а не И. Вам нужно разделить ключевые слова, введенные ПОЛЬЗОВАТЕЛЕМ (вы сказали, что они разделены запятыми), и выполнить цикл foreach через все из них, объединяя те, которые совпадают. Например, если в столбце вашей таблицы есть «один, два, двадцать три», а пользователь вводит «один, пять», он будет совпадать, потому что оба столбца в таблице и пользовательский ввод содержат «один».