2010-11-17 3 views
6

В обычный старый SQL, я могу сделать что-то вроде этого:Могу ли я настроить сортировку результатов запроса в nHibernate?

select * from mytable COLLATE Latin1_General_CS_AS

Есть ли способ, чтобы определить тип сортировки я хочу использовать для данного запроса в NHibernate, в HQL или критериев?

ответ

6

Germán Schuager сумел указать сортировку во время выполнения. Посмотрите here.

var user = session.CreateCriteria(typeof (User)) 
    .Add(Expression.Sql("Username like ? collate Modern_Spanish_CS_AS", username, NHibernateUtil.String)) 
    .UniqueResult<User>(); 
+0

Спасибо. какое облегчение! –

2

Из same link чем rebelliard answer с обеспечением, Shuager также предоставляет способ определения пользовательской функции для делать что-то подобное. Это имеет то преимущество, что можно использовать и в HQL.

Его реализация пользовательской функции была слишком специфична для вашего вопроса и моих собственных нужд, так вот реализация у меня закончился:

/// <summary> 
/// Customized dialect for allowing changing collation on <c>like</c> statements. 
/// </summary> 
public class CustomMsSqlDialect : MsSql2008Dialect 
{ 
    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public CustomMsSqlDialect() 
    { 
     RegisterFunction("withcollation", 
      new WithCollationFunction()); 
    } 
} 

/// <summary> 
/// Add collation to string argument. 
/// </summary> 
[Serializable] 
public class WithCollationFunction : SQLFunctionTemplate, IFunctionGrammar 
{ 
    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public WithCollationFunction() 
     : base(NHibernateUtil.String, "?1 collate ?2") 
    { 
    } 

    bool IFunctionGrammar.IsSeparator(string token) 
    { 
     return false; 
    } 

    bool IFunctionGrammar.IsKnownArgument(string token) 
    { 
     return Regex.IsMatch(token, "[A-Z][A-Z0-9_]+_(?:CS|CI)_(?:AS|AI)(?:_KS)?(?:_WS)?", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); 
    } 
} 

Ума диалекта базового класса, я использовал 2008 диалект, вы можете хочу изменить это. Не забудьте изменить свой диалект HQL на новый пользовательский диалект (используя, например, свойство конфигурации диалекта на вашем сеансе-фабрике).

Пример использования в HQL, стандартный запрос без сортировки настройки:

from Cat as c 
where c.Name like 'fel%' 

С пользовательской сортировки

from Cat as c 
where c.Name like withCollation('fel%', French_CI_AI) 

Работает с Nhib 3.2.

+0

Первоначальный отклик заканчивался странным синтаксисом: «где customLike (c.Name, 'fel%', CI_AI)". Я изменил это (на SO и в моем собственном коде) для более естественного и более гибкого синтаксиса. –

Смежные вопросы