Могу ли я использовать функции SQL в NHibernate QueryOver?

#nhibernate #queryover #dialect

#nhibernate #выполнение запроса #диалект

Вопрос:

Я искал в Интернете и не могу найти пример того, как использовать queryover nhibernate 3.0 Например, я хотел бы использовать строковые функции в предложении where запроса, например:

 var item = Query.Where(x => x.Name.ToLower() == name.ToLower()).FirstOrDefault();
  

Но это не работает, потому что nhibernate не может понять ToLower, так как же можно расширить диалект таким образом, чтобы это стало возможным?

Ответ №1:

 session.QueryOver<Foo>()
    .Where(Restrictions.Eq(
        Projections.SqlFunction("lower", NHibernateUtil.String, 
            Projections.Property<Foo>(x => x.Name)),
        name.ToLower()))
  

должен получить SQL, подобный where lower(Name) = @p0

Комментарии:

1. Привет, спасибо за ответ, это действительно сработало, вы не знаете, как долго я искал это решение. Спасибо

2. @Ruben Monteiro нет проблем, я обнаружил, что иногда вам нужно смешивать некоторые критерии при работе с QueryOver.

Ответ №2:

Я полагаю, что это работает, по крайней мере, в используемой мной сборке (версия 3.0.0.4000)… ниже приведен мой пример…

 var reasons = _session.Query<Reason>();
var myReason = (from r in reasons 
                where r.IsCritical 
                   amp;amp; r.ReasonCode.ToUpper() == reasonCode.ToUpper() 
               select r).FirstOrDefault();
  

Попробуйте и дайте мне знать, работает ли это у вас…

Комментарии:

1. это приводит к созданию предложения where, которое использует функцию UPPER() в SQLServer… (что может плохо сказаться на производительности … к вашему сведению)

2. Я попробовал этот var query = Session. GetISession().QueryOver<Бюджет>();var item = (из f в запросе, где f.Описание. ToLower() == описание. ToLower () выберите f).List().FirstOrDefault(); и получил эту ошибку при вызове нераспознанного метода в epression f.Описание. ToUpper (), моя версия NHibernate, если 3.1.0.4000, @Todd — Я знаю о проблеме с производительностью, но мне нужно реализовать это таким образом

3. Интересно… ваше право, это не работает, когда вы используете синтаксис QueryOver … я предполагаю, что когда-нибудь это будет исправлено… В зависимости от ваших потребностей вы могли бы перейти к использованию синтаксиса запроса для этого, и это должно сработать… ваш код будет обновлен следующим образом…

4. var query = сессия. GetISession().Запрос<Бюджет>();var item = (из f в запросе, где f.Описание. ToLower() == описание. Для ToLower() выберите f). FirstOrDefault();