#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();