2010-04-08 13 views
13

Mam podmiot i jego mapowania:Czy NHibernate LINQ obsługuje ToLower() w klauzulach Where()?

public class Test 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 

public class TestMap : EntityMap<Test> 
{ 
    public TestMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Description); 
    } 
} 

Próbuję uruchomić kwerendę na nim (chwycić go z bazy danych):

var keyword = "test" // this is coming in from the user 
keyword = keyword.ToLower(); // convert it to all lower-case 

var results = session.Linq<Test> 
    .Where(x => x.Name.ToLower().Contains(keyword)); 

results.Count(); // execute the query 

Jednak, gdy biegnę to zapytań, pojawia się następujący wyjątek:

Index was out of range. Must be non-negative and less than the size of the 
collection. Parameter name: index 

mam rację, kiedy mówią, że obecnie LINQ do NHibernate nie obsługuje ToLower()? A jeśli tak, czy istnieje alternatywa, która pozwala mi szukać ciągu w środku innego ciągu, z którym Linq do NHibernate jest kompatybilny? Na przykład, jeśli użytkownik wyszukuje kap, potrzebuję go do dopasowania Kapiolani, i Lapkap.

+0

Dlaczego Twoim zdaniem problem polega na wywołaniu ToLower() - jest to standardowa metoda zdefiniowana w klasie String i nie powinna mieć nic wspólnego z NHibernate LINQ. W którym wierszu w powyższym źródle otrzymujesz wyjątek? – Slavo

+1

Na 'wynik.Count()', ponieważ to jest kiedy jest oceniane. I ma wiele wspólnego z Linq do NHibernate, ponieważ musi go przekonwertować do SQL. –

+0

Dostawca Linq jest dość stary i nie był od jakiegoś czasu aktualizowany. To może zadziałać, ale możesz także chcieć wypróbować nowszego dostawcę Linq w bagażniku NHibernate. –

Odpowiedz

10

miałem to się stało ostatnio. Mogę ci powiedzieć, że ToLower() nie działa, a funkcje Contains() i StartsWith() działają i nie są rozróżniane wielkie i małe litery. Możesz uzyskać pożądany efekt, używając bezpośrednio Contains() i StartsWith().

+0

Doh, nie mogę uwierzyć, że nie zauważyłem, że 'Contains()' i 'StartsWith()' nie uwzględniają wielkości liter. Wczoraj zmarnowałem 5 godzin próbując uruchomić 'ToLower()', gdy jest już zaimplementowane! –

1

Zgodnie z comments w tych dwóch blogach posts ta funkcja to not implemented yet.

+0

Ten wątek NHUsers w Google Groups sugeruje, że działa. –

+0

@Michael, Nie znalazłem żadnych dowodów w tym wątku sugerujących, że to działa. –

0

Możesz chcieć sprawdzić, czy baza danych używa wielkości liter.

Jeśli nie, wtedy nie trzeba .ToLower()

10

Wydaje się, że wokół tego tematu jest dużo zamieszania.

  • "Stary" dostawca Linq (dla NHibernate 2.x) prawdopodobnie może tego nie obsługiwać. Jeśli tak jest, nigdy nie będzie, ponieważ nie jest już utrzymywany.
  • Nowy usługodawca (w zestawie z NHibernate 3.x) robi wsparcie to (choć ToUpper i Metoda ToLower wydają się być odwrócone, zobacz http://groups.google.com/group/nhibernate-development/browse_thread/thread/a167216e466b3241)
  • Contains i StartsWith map dla operatora LIKE w SQL. Są one nieważne niezależnie od wielkości liter; to sortowanie sprawia, że ​​są one niewrażliwe na wielkość liter, więc zależy to od tego, jak utworzono kolumnę/schemat.

Update (2010-04-09): bug potwierdzone i łata składane zobaczyć https://nhibernate.jira.com/browse/NH-2169

Update (2010-05-21): poprawka została zastosowana na 2010-05-01 i teraz działa zgodnie z oczekiwaniami .

+0

, jaka wersja ma poprawkę? –

+0

@LouisRhys wystarczy pobrać najnowszą stację. –