2010-11-17 10 views

risposta

6

Germán Schuager è riuscito a specificare le regole di confronto in fase di esecuzione. Dai uno sguardo allo here.

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

Grazie. che sollievo! –

2

Dal same link di rebelliard answer fornire, Shuager fornisce anche un modo per definire una funzione personalizzata per fare qualcosa di simile. Questo ha il vantaggio di essere utilizzabile anche in HQL.

sua implementazione funzione personalizzata era troppo specifico per la tua domanda e le mie esigenze, ecco l'implementazione ho finito 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 classe base dialettale, ho usato 2008 dialetto, si può desidero cambiarlo. Non dimenticare di cambiare il tuo dialetto HQL con il tuo nuovo dialetto personalizzato (usando la proprietà di configurazione "dialect" del tuo factory di sessione, per esempio).

Esempio di utilizzo in HQL, query standard senza personalizzazione collazione:

from Cat as c 
where c.Name like 'fel%' 

Con confronto personalizzato

from Cat as c 
where c.Name like withCollation('fel%', French_CI_AI) 

Funziona con Nhib 3.2.

+0

La risposta iniziale si concludeva con una sintassi strana: "dove customLike (c.Name, 'fel%', CI_AI)". Ho cambiato questo (su SO e nel mio codice) per avere una sintassi più naturale e anche più flessibile. –

Problemi correlati