Возникла типичная задача: по введенным данным пользователя найти нужного человека. Поле для ввода у пользователя одно. Если в это поле вводиться "Иванов", то по такому запросу найти легко, но если будет введено "Иванов Вова", то тут возникают проблемы, потому что для имени и фамилии в базе созданные разные поля. Для такого запроса нужно создать 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, то они создадут между собой множество условий, которые соединены командой &&.
|