2010-12-07 1 views
0

Я использую NH2.1 с конфигурацией FluentNH и Linq2NH в базовой модели репозитория. Я пытаюсь настроить запрос, который будет переваривать различные поля формы из winform. Критерии в значительной степени ряд текстовых полей, каждый из которых имеет флажок с указанием того, содержат ли критерии подстановочных знаков (только звездочки поддерживаются), поэтому логика серии:Комплексные критерии для запроса NHibernate: Linq или ICriteria?

... 
&& Field1.IsNullOrBlank() || Field1 == Criteria1 || (Criteria1IsWildCard && Regex.Match(Field1, Criteria1.Replace("*",".*"))) 
&& Field2.IsNullOrBlank() || Field2 == Criteria2 || (Criteria2IsWildCard && Regex.Match(Field2, Criteria2.Replace("*",".*"))) 

Теперь, это было бы просто замечательно для Linq2Objects, однако он не будет очень далеко в запросе Linq2NH по нескольким причинам (собственные методы расширения, проверка регулярных выражений и т. Д.).

Я создал другую страницу поиска, которая должна переваривать похожие данные, однако этот запрос выполняется против другого источника данных Репозитория, который требует запроса в виде строки (SalesForce SOQL). Поскольку у NHibernate есть так много более сложных, доступных для компилятора инструментов, я бы предпочел, чтобы HQL был моим последним вариантом.

Другая важная информация:

  • Извлечение и кэширование содержимого всей таблицы для того, чтобы отфильтровать результаты Linq2Objects едва выполнимо (таблица около 15к записей), но любой вариант, который не должен сделать это очень предпочтительным.
  • Пользователь должен иметь столько подстановочных знаков, сколько необходимо; поэтому нецелесообразно использовать метод обхода StartsWith()/EndsWith()/Contains().

Итак, вопрос в том, как бы вы установили это для выполнения против NHibernate?

ответ

0

Ответ, на который я пришел, - использовать методы StartsWith/EndsWith для получения операции LIKE, а также заменить любые звездочки на%. Если критерии начинаются со звездочки, используйте EndsWith, иначе используйте StartsWith. Это превратило бы «abc *» в «abc %%», «* abc» в «%% abc» и «* abc *» в «%% abc%», которые все одинаково оцениваются с не дублируемыми сопоставленными экземплярами %% в предложении LIKE. Единственный сценарий, в котором он не будет работать, как указано, - это ввести критерии, которые не начинаются и не заканчиваются подстановочным знаком; если сравнивать «a * c» с abc, adc и abcde, он будет оценивать «% c%» вместо «a% c» и будет возвращать все из них вместо исключения abcde. Достаточно близко для моих целей.

0

HQL, ICriteria, Linq-to-NH и любые другие API переведены в SQL окончательно. Так как MS-SQL Server и другие не поддерживают дикие символы напрямую, вы не можете использовать дикие символы в своих критериях.

+1

Не как звездочки, но MSS поддерживает LIKE-сравнения с использованием групповых символов%, а модель NH ICriteria поддерживает это напрямую, в то время как Linq2NH поддерживает преобразование StartsWith, EndsWith и Содержит в LIKE операции с% в начале, в конце или с обеих сторон, как применимо , – KeithS

+0

Но я имел в виду «звездочки» –