LINQ. Реализация Like по множеству слов

Programming
Предыдущий Следующий

C#Возникла типичная задача: по введенным данным пользователя найти нужного человека. Поле для ввода у пользователя одно. Если в это поле вводиться "Иванов", то по такому запросу найти легко, но если будет введено "Иванов Вова", то тут возникают проблемы, потому что для имени и фамилии в базе созданные разные поля. Для такого запроса нужно создать sql такого рода: FirstName like '%'+'Иванов'+'%' or FirstName like '%'+Вова+'%'  и такое же для LastName. Т.е. нужно для множества полей, отфильтровать по множеству слов.

Немного поразмыслив приходим к такой логики. Разбиваем нашу фразу на слова "Иванов Вова".Split(' '). И полученный массив передаем в процедуру:

IQueryable<Person> SearchPersons (params string[] keywords)
{
  IQueryable<Person> query = dataContext.Persons;

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    query = query.Where (p => p.FirstName.Contains (temp) || p.LastName.Contains (temp));
  }
  return query;
}

Это процедура возвратить нам как раз то что нужно. Переменная temp создается  для избежание переопределения переменой keyword  в цикле foreach. Когда будем перебирать в цикле условия Where, то они создадут между собой множество условий, которые соединены командой &&.

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси