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.
fonte
2012-08-24 16:10:23
Grazie. che sollievo! –