Я действительно считаю, что это простая проблема, но одна из тех, у которых решение не очевидно для новичка из NHibernate, такого как я ...
Вот в чём дело, я выполняю свои связанные с NHibernate запросы из уровня службы данных, который ничего не знает о NHibernate (для разделения интересов). Поэтому я строю свои запросы с помощью LINQ (Sytem.Linq).
Я хочу найти более одного слова. Например, если кто-то наберет «training excel», я буду искать несколько объектов и связанных объектов местоположения на основе обоих слов.
Вот как сейчас выглядит мой код на уровне сервисов:
// We are delimiting by spaces and commas.
string delimiterString = " ,";
char[] delimiter = delimiterString.ToCharArray();
IEnumerable<string> words = searchWords.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
// Loop through each search word in the collection and apply the "Where" clause to our IQueryable collection:
foreach (string word in words) {
matches = matches.Where(i => i.Subject.Contains(word)
|| i.Background.Contains(word)
|| i.Summary.Contains(word)
|| i.Organization.Contains(word)
|| i.Locations.Any(l => l.Organization.Contains(word))
|| i.Locations.Any(l => l.City.Contains(word))
);
}
Вот в чем проблема ... просматривая журналы приложений и запуская NHibernate Profiler, я вижу, что запрос T-SQL корректно создается. Поиск работает нормально только с одним переданным поисковым словом. Однако, если обнаружено 2 или более слов, последнее найденное слово является единственным из найденных. Например, если поисковый термин был «training excel» , то, когда я перебираю код, указанный выше, оба слова будут правильно добавлены в цикл, но в конечном выводе T-SQL будет «excel» в оба логических, где группы в предложении WHERE (то есть WHERE course.Subject like ('%' + 'excel' + '%')...... AND course.Subject like ('%' + 'excel' + '%')......
). Должно было быть "обучение" в первой группе и "превосходство" во второй группе.
Кажется, что NHibernate использует какой-то вид кэширования запросов для эффективности, потому что сигнатура запроса одинакова (так как мы перебираем все слова). Опять же, я убедился, что оба слова используются при пошаговом выполнении моего кода.
Есть идеи ??