У меня есть большое приложение ASP.NET, которое использует NHibernate (v3.2.0.4000) для доступа к SQL Server 2005 в качестве внутреннего хранилища данных. У нас есть несколько клиентов, каждый клиент имеет собственную базу данных, но все базы данных работают на одном сервере.Изменить сортировку по запросам NHibernate
Быстрый вопрос:
Без установки COLLATION на сервере базы данных, или сами, или переписывание существующего индивидуального NHibernate код запроса отдельных базы данных, как я могу добавить пользовательские операторы COLLATION на запросы NHibernate, чисто для заказа целей , прежде чем они попадут в базу данных?
Вопрос дольше:
Из-за наличия новых международных клиентов нам необходимо поддерживать пользовательскую сортировку для сортировки в нашем приложении. Мы не можем сделать это на уровне базы данных (или сервера), поскольку мы размещаем отдельную базу данных для каждого клиента на том же сервере (каждый клиент может иметь разные требования к сопоставлению), и есть сложности с такими вещами, как TempDB и т. Д., И несколько разных сопоставления на том же сервере (см. here и here).
В результате различия в том, как NHibernate используется на всей кодовой базе (например, комбинация HQL, ICriteria, простой SQL, QueryOver и Linq), и поскольку многие из этих запросов очень сложны и беспорядочны, мы хотим полностью избегайте изменения любого существующего кода запроса NHibernate.
SQL Server позволит ссылаться запросом с определенной комплектовкой применяется на время выполнения этого запроса, например, так: SELECT * FROM Customer ORDER BY Surname COLLATE Latin1_General_CI_AS
Я также знаю, что NHibernate позволяет создание Interceptor
, которые могут быть добавлены в NHibernate на основе глобального или сеанса (как показано here), что позволяет перехватить инструкцию SQL до ее отправки на SQL Server.
Кажется, я могу написать класс перехватчика, чтобы перехватить SQL-заявление, но это просто позволяет мне захватить необработанное SQL-заявление (в комплекте с странными и прекрасными именами и псевдонимами NHibernate). Я не знаю, есть ли способ, чтобы я мог чисто проанализировать определенные части запроса (мне нужно только предложение ORDER BY) и изменить отдельные составляющие части предложения ORDER BY (т.е. отдельные поля) после проверки того, что поля основаны на тексте и позволят добавить к ним инструкцию COLLATE.
NHibernate предоставляет интерфейс NHibernate.SqlCommand.ISqlStringVisitor
, который звучит многообещающе и, кажется, работают на SqlString
захваченной в OnPrepareStatement
способе EmptyInterceptor
класса, который может быть переопределен, однако, я совершенно не знаком с этой частью NHibernate, и это Безразлично» t помочь, что в настоящее время, как я пишу это, NHibernate, предположительно, окончательный источник информации, nhibernate.info, не работает (и, похоже, уже несколько недель)!
Должен ли кто-нибудь выполнять такую задачу? Возможно ли исключить запросы NHibernate чистым и безопасным способом? Существует ли совершенно другой подход, который мог бы достичь того же самого (учитывая те же ограничения, что и неспособность изменить сортировку базы данных/сервера)?
Учет не только в порядке, но и в любом сравнении строк (равенство, например, ...). Разбор запроса, хотя это возможно (http://codetype.wordpress.com/2012/11/01/net-sql-parsing-using-the-tsqlparser-library/), кажется огромной работой, с большим количеством выполнение служебных обязанностей. Возможно, это простое решение для разных баз данных. – jbl
@jbl - Я понимаю, что для сопоставления больше, чем для заказа, но для целей нашего приложения нам нужно только заботиться о заказе. Использование разных настроек сортировки на уровне базы данных нецелесообразно по причинам, указанным в моем существующем сообщении. – CraigTP
Когда вы пишете «В результате различия в том, как NHibernate используется во всей кодовой базе ...», вы имеете в виду, что существуют HQL, ICriteria, простой SQL, QueryOver и Linq? (У меня есть все это в моей кодовой базе). Должен признаться, я не вижу другого выбора, кроме синтаксического анализа запроса, или получаю собственную ветвь NH для переопределения всех мест, где задействовано упорядочение. – jbl