2012-03-03 2 views
3

Я использую благородные предшественники HQL-запрос с NHibernate:NHibernate HQL с ISNULL() в котором не работает

from Contact a where 
a.Id in (select x.Person.Id from PersonCompany x 
      inner join x.Company y 
      inner join y.Addresses z 
     where isnull(z.Street,'')+isnull(z.PostalCode,'') Like :val) 

В этом запросе, NHibernate пытается преобразовать: Val (который является строкой) к двойному , z.Street и z.PostalCode - это строковые поля, которые могут быть пустыми. Похоже, что NHibernate имеет проблему с первым isnull() в where-clause. Когда я использую z.Street+isnull(z.PostalCode,''), он работает. Я также пробовал cast(isnull(z.Street,'')+isnull(z.PostalCode,'') as string), но это тоже не работает, потому что NHibernate имеет проблему с функцией cast (он генерирует более двух параметров). Может кто-нибудь мне помочь, как я могу решить это с помощью NHibernate? - Может быть, есть еще один способ написать условие-условия?

Я использую NHibernate 3,2

ответ

3

Попробуйте concat(coalesce(z.Street,''), coalesce(z.PostalCode,''))

+0

это genereates в парование, где: (IsNull (addresses3_.Street + '') + IsNull (addresses3_.PostalCode + '')), который выбрасывает SqlException с СООБЩЕНИЯ IsNull функция требует 2 аргумента (ов) – BennoDual

+0

Попробуйте новую версию. 'isnull' не зарегистрирован для большинства диалектов; «coalesce» - это стандарт. Он может работать, когда используется сам по себе, потому что NHibernate передает его. –

+0

Я пробовал это прямо сейчас, и он будет работать идеально :-) – BennoDual