Если у вас MS Sql Server 2005+, для вашего заявленного примера будет работать следующее:
var inputString = "iPhone 4";
var token = inputString.ToLower().Replace(" ", "");
var tokenizedQuery = DataContext.Devices.Select(d => new { Device = d, Token = d.Name.ToLower().Replace(" ", "") });
var filteredQuery = tokenizedQuery.Where(d => d.Token == token);
var resultsQuery = filteredQuery.Select(d => d.Device).OrderByDescending(d => d.Count);
var result = resultsQuery.FirstOrDefault();
Вот что происходит:
- Вы создаететокеновую версию вашей входной строки, поместив ее в нижний регистр и затем удалив пробелы.
- Затем вы создаете псевдостолбец в своей таблице, чтобы создать аналогичный столбец токенов
- Фильтруйте результаты на основеэтот токен
- Наконец, выберите только запись с наибольшим количеством
Однако очень важно, чтобы вы понимали, что методы ToLower () и Replace () переводятся в T-Команды SQL, которые выполняются на сервере sql , а не в вашем приложении.Это означает, что если вам нужны более сложные подпрограммы токенизации, или вы не используете MS SQL , это может не сработать!
Как уже отмечали другие, вы, возможно, захотите немного очистить свой дизайн.По сути, вы храните ключевое слово или ключевое слово для поиска, которое может иметь много перестановок.Выполнение токенизации в запросе не является переносимым или производительным, поэтому в идеале вы должны хранить токенизированную версию этой строки в своем собственном столбце.В качестве альтернативы посмотрите полнотекстовые индексы , так как они могут также решить вашу проблему (опять же, если используется MSSQL).