Desde el same link que proporcionan rebelliard answer, Shuager también suministra una manera de definir una función personalizada para hacer algo similar. Esto tiene la ventaja de ser utilizable en HQL también.
Su aplicación función personalizada era demasiado específico para su pregunta y mis propias necesidades, por lo que aquí es la aplicación que he terminado con:
/// <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);
}
}
mente la clase base dialecto, he utilizado 2.008 dialecto, es posible deseo cambiar eso No olvides cambiar tu dialecto HQL a tu nuevo dialecto personalizado (usando la propiedad de configuración "dialecto" de tu fábrica de sesiones, por ejemplo).
Ejemplo de uso en HQL, consulta estándar sin personalización de colación:
from Cat as c
where c.Name like 'fel%'
Con el cotejo de encargo
from Cat as c
where c.Name like withCollation('fel%', French_CI_AI)
Funciona con NHib 3.2.
Gracias. ¡eso es un alivio! –