2010-11-17 12 views
6

सादे पुराने एसक्यूएल में, मैं कुछ इस तरह कर सकते हैं:क्या मैं nHibernate में क्वेरी परिणामों के संयोजन को कस्टमाइज़ कर सकता हूं?

select * from mytable COLLATE Latin1_General_CS_AS

वहाँ मिलान के प्रकार मैं nHibernate में किसी क्वेरी के लिए उपयोग करने के लिए, HQL में या मापदंड में चाहते हैं निर्दिष्ट करने के लिए कोई तरीका है?

उत्तर

6

जर्मन शूगर रन टाइम पर संयोजन निर्दिष्ट करने में कामयाब रहा है। here देखें।

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

धन्यवाद। कि एक राहत की बात है! –

2

same link से rebelliard answer प्रदान से, Shuager भी कुछ इसी तरह करने के लिए एक कस्टम समारोह को परिभाषित करने के लिए एक तरह से आपूर्ति करती है। इसका एचक्यूएल में प्रयोग करने योग्य होने का लाभ भी है।

उनकी कस्टम समारोह कार्यान्वयन अपने प्रश्न और मेरी अपनी जरूरतों के लिए भी विशिष्ट था, इसलिए यहां कार्यान्वयन मैं के साथ समाप्त हो गया है:

/// <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 में

उदाहरण उपयोग, मिलान अनुकूलन के बिना मानक क्वेरी:

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

कस्टम मिलान Nhib 3.2 के साथ

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

वर्क्स के साथ।

+0

प्रारंभिक प्रतिक्रिया एक अजीब सिंटैक्स के साथ समाप्त हो रही थी: "जहां कस्टम लाइक (c.Name, 'fel%', CI_AI)"। मैंने इसे और अधिक प्राकृतिक और अधिक लचीला वाक्यविन्यास रखने के लिए (एसओ और अपने कोड में) बदल दिया है। –

संबंधित मुद्दे

 संबंधित मुद्दे