NHibernate расширенный поиск головной боли - PullRequest
0 голосов
/ 23 сентября 2011

Я действительно считаю, что это простая проблема, но одна из тех, у которых решение не очевидно для новичка из 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 использует какой-то вид кэширования запросов для эффективности, потому что сигнатура запроса одинакова (так как мы перебираем все слова). Опять же, я убедился, что оба слова используются при пошаговом выполнении моего кода.

Есть идеи ??

1 Ответ

0 голосов
/ 25 сентября 2011

Это должно быть распространенной ловушкой "доступ к измененному закрытию". Попробуйте

foreach (string word in words)
{
  var wordLoopVariable = word; 
  matches = matches.Where(i => i.Subject.Contains(wordLoopVariable)
    || i.Background.Contains(wordLoopVariable)
    || i.Summary.Contains(wordLoopVariable)
    || i.Organization.Contains(wordLoopVariable)
    || i.Locations.Any(l => l.Organization.Contains(wordLoopVariable))
    || i.Locations.Any(l => l.City.Contains(wordLoopVariable))
);

И поищите в поисках закрытия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...