我可以在nHibernate中自定义查询结果的整理吗?

时间:2010-11-17 04:45:34

标签: nhibernate

在普通的旧SQL中,我可以这样做:

select * from mytable COLLATE Latin1_General_CS_AS

有没有办法在nHibernate,HQL或条件中指定我想用于给定查询的排序规则类型?

2 个答案:

答案 0 :(得分:6)

GermánSchuager设法在运行时指定排序规则。看看here

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

答案 1 :(得分: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方言更改为新的自定义方言(例如,使用会话工厂的“dialect”配置属性)。

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合作。