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
.
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
Na 'wynik.Count()', ponieważ to jest kiedy jest oceniane. I ma wiele wspólnego z Linq do NHibernate, ponieważ musi go przekonwertować do SQL. –
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. –