Linq поиск по нескольким ключевым словам

1

Я много искал для легкого ответа на этот вопрос, но я потерпел неудачу. Я совершенно не знаком с 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());
    }
  • 0
    Для уточнения Users на самом деле поисковый термин содержит одно или несколько слов?
  • 0
    Да, «Пользователи» содержат ключевые слова для поиска, отправленные из представления.
Теги:
linq
asp.net-mvc
search

3 ответа

5
Лучший ответ

Если я не ошибаюсь, то я считаю, что вы хотите искать условия отдельно, то есть для '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

  • 1
    Однако это меняет семантику с «Город содержит {термин}» на «Город равен {термин} для одного из {терминов}» (выделение равно)
  • 0
    @MarcGravell, о да, Марк, просто собираюсь изменить на Любой с Содержит.
Показать ещё 5 комментариев
0

Я думаю, что проще всего использовать 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());
}
0

Вы можете попробовать следующее:

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. Если да, то результат верен. В противном случае это ложь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню