Можно ли настроить параметры сортировки результатов запроса в nHibernate? - PullRequest
6 голосов
/ 17 ноября 2010

В простом старом SQL я могу сделать что-то вроде этого:

select * from mytable COLLATE Latin1_General_CS_AS

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

Ответы [ 2 ]

6 голосов
/ 17 ноября 2010

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

var user = session.CreateCriteria(typeof (User))
    .Add(Expression.Sql("Username like ? collate Modern_Spanish_CS_AS", username, NHibernateUtil.String))
    .UniqueResult<User>();
2 голосов
/ 24 августа 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...