NHibernate LINQ поддерживает ToLower () в Где () пункты?

У меня есть объект и его отображение:

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);
    }
}

Я пытаюсь выполнить запрос на нем (для захвата его из базы данных):

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

Однако каждый раз, когда я выполняю этот запрос, я получаю следующее исключение:

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

Действительно ли я прав, когда я говорю, что в настоящее время Linq к NHibernate не поддерживает ToLower()? И если так, есть ли альтернатива, которая позволяет мне искать строку посреди другой строки, с которой Linq к NHibernate совместим? Например, если пользователь ищет kap, Мне нужен он для соответствия Kapiolani, Makapuu, и Lapkap.

14
задан Daniel T. 8 April 2010 в 07:24
поделиться

4 ответа

Это случилось недавно. Я могу сказать вам, что ToLower () не работает, а Contains () и StartsWith () работают и не чувствительны к регистру. Вы можете добиться желаемого эффекта, напрямую используя Contains () и StartsWith ().

10
ответ дан 1 December 2019 в 12:38
поделиться

Согласно комментариям в этих двух сообщениях блога , эта функция еще не реализована .

1
ответ дан 1 December 2019 в 12:38
поделиться

Вы можете проверить, использует ли база данных чувствительность к регистру.

Если нет, то вам не нужно .ToLower ()

0
ответ дан 1 December 2019 в 12:38
поделиться

Похоже, вокруг этого предмета много путаницы.

  • «Старый» провайдер Linq (для NHibernate 2.x), вероятно, не поддерживает это. Если это так, то этого никогда не произойдет, потому что он больше не поддерживается.
  • Новый провайдер (включенный в NHibernate 3.x) действительно поддерживает его (хотя ToUpper и ToLower кажутся инвертированными, см. http://groups.google.com / group / nhibernate-development / browse_thread / thread / a167216e466b3241 )
  • Содержит отображение и StartsWith для оператора LIKE в SQL. Они сами не нечувствительны к регистру; именно сортировка делает их нечувствительными к регистру, поэтому это зависит от того, как был создан ваш столбец / схема.

Обновление (2010-04-09): ошибка подтверждена, исправление отправлено, см. https://nhibernate.jira.com/browse/NH-2169

Обновление (2010-05-21): исправление был применен 01.05.2010 и сейчас работает как положено.

11
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: