Я много искал для легкого ответа на этот вопрос, но я потерпел неудачу. Я совершенно не знаком с MVC и только что создал небольшой поисковый движок. Он отлично работает с 1 ключевым словом, но не более 1 ключевого слова.
Если я ищу "Охота на Огайо", я хочу, чтобы все пользователи получили эти ключевые слова из базы данных. Как исправить это в нескольких строках? Ниже мой текущий немодифицированный код:
public ActionResult Search(string Users)
{
var v = from p in db.UserProfiles
where (p.UserName.Contains(Users)) ||
(p.About.Contains(Users)) ||
(p.City.Contains(Users))
select p;
return View("Find", v.ToList());
}
Если я не ошибаюсь, то я считаю, что вы хотите искать условия отдельно, то есть для 'Ohio fishing'
вы хотите искать Ohio
и рыбалку отдельно. В этом случае вам нужно разбить строку на пробел, а затем использовать как:
public ActionResult Search(string Users)
{
string[] terms = Users.Split();
var v = from p in db.UserProfiles
where (terms.Any(r=> p.UserName.Contains(r))) ||
(terms.Any(r => p.About.Contains(r))) ||
(terms.Any(r => p.City.Contains(r)))
select p;
return View("Find", v.ToList());
}
Вы также должны искать полнотекстовый поиск на SQL Server
Я думаю, что проще всего использовать PredicateBuilder
для создания динамического запроса. Это будет достаточно хорошо работать для небольших запросов в относительно небольшой базе данных, но не очень хорошо масштабируется. Лучшим решением было бы использовать полнотекстовую поисковую систему, такую как Lucene.NET, для индексации ваших данных и выполнения поиска более эффективным образом.
public ActionResult Search(string[] Users)
{
var terms = Users.Split();
var predicate = PredicateBuilder.False<User>90;
foreach (var term in terms)
{
var temp = term; // avoid capture of loop variable
predicate.Or(p => p.UserName.Contains(temp)
|| p.About.Contains(temp)
|| p.City.Contains(temp));
}
var v = db.UserProfiles.Where(predicate);
return View("Find", v.ToList());
}
Вы можете попробовать следующее:
public ActionResult Search(string[] Users)
{
var v = from p in db.UserProfiles
where (Users.Any(x=>p.UserName.Contains(x)) ||
(Users.Any(x=>p.About.Contains(x)) ||
(Users.Any(x=>p.City.Contains(x))
select p;
return View("Find", v.ToList());
}
Теперь, как это работает? возьмите, например, следующее:
Users.Any(x=>p.UserName.Contains(x))
Это проверяется, если есть хотя бы один элемент в массиве называется Users
, где этот элемент содержится ИНТ текущего UserName
. Если да, то результат верен. В противном случае это ложь.
Users
на самом деле поисковый термин содержит одно или несколько слов?