Сложные критерии для запроса NHibernate: Linq или ICriteria? - PullRequest
0 голосов
/ 07 декабря 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 декабря 2010

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

0 голосов
/ 08 декабря 2010

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

...