Из 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.
Спасибо. какое облегчение! –