Нечувствительное к регистру упорядочивание вида в NHibernate

Это действительно должно быть (low+high)//2. Как и сейчас, mid начинается с последнего элемента в списке и всегда проходит через остальную часть условия guess>item. Таким образом, high уменьшается на 1 каждый раз, а low никогда не меняется (с нуля). Процесс заканчивается тем, что проходит все элементы от последнего к первому, что вовсе не является двоичным поиском (скорее, последовательным поиском).

6
задан Geir-Tore Lindsve 14 April 2009 в 06:23
поделиться

4 ответа

Вы сможете добиться этого, заказав проекцию, которая нормализует ситуацию для вас. Например, в Oracle есть «нижняя» функция, которая переводит строковые типы данных в нижний регистр, такие как varchar2 и nvarchar2; поэтому я буду использовать эту функцию sql, чтобы сформировать проекцию, которая будет упорядочена соответствующим образом.

var projection = Projections.SqlFunction("lower", 
                                         NHibernateUtil.String, 
                                         Projections.Property("Name"));

var x = SomeCriteria.AddOrder(Orders.Asc(projection)).List()

Если вы используете SQL Server, для повышения эффективности я бы рекомендовал использовать функцию «верхний» вместо «нижний». Microsoft оптимизировала свой собственный код для выполнения сравнения в верхнем регистре, тогда как остальной мир, похоже, оптимизировал для нижнего регистра.

10
ответ дан 8 December 2019 в 17:27
поделиться

В Hibernate (Java) есть метод ignoreCase () для класса "Order", но он выглядит как NHibernate этот метод не указан в его «Порядке».

Вот как я думал, вы могли бы это сделать:

var x = SomeCriteria.AddOrder(new Order("Name", true).IgnoreCase()).List();

Но, к сожалению, IgnoreCase () не существует.

В качестве обходного пути вы можете использовать HQL или SQL-запрос - любой из них должен позволять упорядочивать без учета регистра.

2
ответ дан 8 December 2019 в 17:27
поделиться

Это, вероятно, зависит от настройки чувствительности к регистру на вашем сервере базы данных. Я подозреваю, что NHibernate просто выдает предложение "ORDER BY"; по крайней мере, я не могу себе представить, что еще он будет делать. Для SQL Server по умолчанию порядок сортировки (сортировка) является словарным, без учета регистра.

В этой статье приводятся некоторые методы выполнения поиска с учетом регистра в SQL Server. Однако мой совет - сортировать список, возвращаемый запросом в коде. Это решение сохраняет независимость от базы данных NHibernate и позволяет настраивать порядок сортировки в соответствии с вашими потребностями.

2
ответ дан 8 December 2019 в 17:27
поделиться

Поскольку я знаю, что ответы на мой запрос всегда довольно малы, я закончил тем, что запрашивал данные как обычно и сортировал их впоследствии используя Linq. Это работает, так что зачем настраивать NHibernate;) (Использование SQLite, кстати)

0
ответ дан 8 December 2019 в 17:27
поделиться
Другие вопросы по тегам:

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