Из той же ссылки , что и 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.