2011-05-11 15 views
10

I zostały poszukiwania w internecie i nie mogę znaleźć przykład, w jaki sposób korzystać z queryover z NHibernate 3,0 Na przykład chciałbym użyć funkcji ciąg w klauzuli WHERE queryover Ex:Czy mogę korzystać z funkcji SQL w NHibernate QueryOver?

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

Ale to nie działa, ponieważ nhibernate nie może zrozumieć ToLower, więc w jaki sposób można rozszerzyć dialekt w taki sposób, aby stało się to możliwe?

Odpowiedz

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

powinno Ci SQL jak where lower(Name) = @p0

+0

Cześć, dziękuję za odpowiedź, że zadziałało, nie wiesz jak długo i dużo szukałem tego rozwiązania. Dzięki –

+0

@Ruben Monteiro nie ma problemu, uważam, że czasami trzeba mieszać niektóre Kryteria podczas pracy z QueryOver. – dotjoe

0

wierzę, że działa przynajmniej w kompilacji używam (wersja 3.0.0.4000) ... Poniżej jest mój przykład ...

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

Daj mu strzał i daj mi znać, czy działa dla Ciebie ...

+0

skutkuje to gdzie klauzula, która wykorzystuje upper() funkcji w SQLServer ... (co może być szkodliwe dla wydajności ... FYI) – Todd

+0

Próbowałem tego zapytania var = Session.GetISession(). QueryOver (); var item = (od f w zapytaniu gdzie f.Description.ToLower() == description.ToLower() wybierz f) .List(). FirstOrDefault()); i dostał ten błąd Nierozpoznany wywołanie metody w epression f.Description.ToUpper(), moja wersja nHibernate, jeśli 3.1.0.4000, @Todd - Znam problem z wydajnością, ale muszę go wdrożyć w ten sposób –

+0

Interesujące ... twoje prawo to nie działa, gdy używasz składni QueryOver ... moje przypuszczenie jest pewnego dnia, które zostanie naprawione ... W zależności od twoich potrzeb możesz przejść do używania składni zapytania do tego i powinno działać ... twój kod byłby zaktualizowane w następujący sposób ... – Todd

Powiązane problemy