2010-11-17 6 views

Respuesta

6

Germán Schuager ha logrado especificar la intercalación en tiempo de ejecución. Eche un vistazo here.

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

Gracias. ¡eso es un alivio! –

2

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.

+0

La respuesta inicial terminaba con una sintaxis extraña: "donde customLike (c.Name, 'fel%', CI_AI)". He cambiado eso (en SO y en mi propio código) por tener una sintaxis más natural y también más flexible. –

Cuestiones relacionadas