Поддерживает ли NHibernate LINQ предложения ToLower () в выражениях Where ()? - PullRequest
14 голосов
/ 08 апреля 2010

У меня есть сущность и ее отображение:

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.

Ответы [ 4 ]

11 голосов
/ 08 апреля 2010

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

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

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

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

10 голосов
/ 08 апреля 2010

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

1 голос
/ 08 апреля 2010

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

0 голосов
/ 08 апреля 2010

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

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

...