2011-05-24 19 views
5

मैं एक nhibernate LINQ क्वेरी है कि इस तरह दिखता है:NHibernate/MySQL स्ट्रिंग संयोजन

from b in session.Query<Bookmark>() 
where b.Uri.Equals(uri) || 
     b.Uri.Equals("www." + uri) || 
string.Concat("www.", b.Uri).Equals(uri) 
select b 

यह ऊपर चल रही है, कह रही है Concat का समर्थन नहीं कर रहा है, लेकिन जब मैं यह

from b in session.Query<Bookmark>() 
where b.Uri.Equals(uri) || 
     b.Uri.Equals("www." + uri) || 
     ("www." + b.Uri).Equals(uri) 
select b 

करने के लिए बदल यह ठीक चलाता है, लेकिन क्वेरी इस तरह दिखता है:

select cast(count(*) as SIGNED) as col_0_0_ 
from bookmarks bookmark0_ 
where bookmark0_.Uri = 'www.google.com' 
    or bookmark0_.Uri = 'www.www.google.com' 
    or 'www.'+bookmark0_.Uri = 'www.google.com'; 

कहाँ 'www।' + bookmark0_.Uri "जोड़ा" है concat के बजाय ('www। ', Bookmark0_.Uri)। क्या MySQL के लिए NHibernate के लिए लिंक में तारों को संयोजित करने का कोई तरीका है?

+0

सही जवाब [यहां] (http://stackoverflow.com/questions/2680116/invoke-sql-function-using-nhibernate) देखते हैं, लेकिन वे मापदंड एपीआई – jjjjj

उत्तर

6

निम्नलिखित एक HqlGenerator कि इस समस्या का हल है।

public class LinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry 
{ 
    public LinqToHqlGeneratorsRegistry() 
     : base() 
    { 
     this.Merge(new ConcatHqlGenerator()); 
    } 
} 
private static ISessionFactory CreateSessionFactory() 
{ 
    var configuration = new NHib.Cfg.Configuration(); 
    configuration.Properties.Add(NHibernate.Cfg 
              .Environment.LinqToHqlGeneratorsRegistry, 
typeof(LinqToHqlGeneratorsRegistry).AssemblyQualifiedName); 
    configuration.Configure(); 
    return configuration.BuildSessionFactory(); 
} 
+0

इस समाधान को सत्र में बी से क्वेरी मिली .Query () जहां b.Uri.Equals (uri) || बी.यूरी.इक्वाल्स ("www।" + Uri) || स्ट्रिंग। कॉनकैट ("www।", बी.यूरी) .क्वल्स (यूरी) बी का चयन करें; काम करने के लिए, धन्यवाद ट्रैविस! – andrewjboyd

+0

यदि आप स्ट्रिंग के अलावा कुछ और उपयोग कर रहे हैं तो यह काम करेगा: treebuilder.Cast (visitor.Visit (तर्क [0])। AsExpression(), टाइपऑफ (स्ट्रिंग)) – AlexDev

+0

या बेहतर अभी तक: तर्क [0]। टाइप == टाइपोफ (स्ट्रिंग)? आगंतुक। विज़िट (तर्क [0])। AsExpression(): treebuilder.Cast (विज़िटर। विज़िट (तर्क [0])। AsExpression(), टाइपऑफ (स्ट्रिंग)) – AlexDev

0

thats क्योंकि दो प्रकार की संगतता। हो सकता है कि आप स्ट्रिंग का प्रयास कर सकें। कॉनकैट ("www" + b.Uri.ToString);

public class ConcatHqlGenerator : BaseHqlGeneratorForMethod 
{ 
    public ConcatHqlGenerator() 
     : base() 
    { 
     this.SupportedMethods = new[] 
     { ReflectionHelper.GetMethodDefinition(() => string.Concat(null, null)) }; 
    } 

    public override HqlTreeNode BuildHql(MethodInfo method, 
Expression targetObject, 
ReadOnlyCollection<Expression> arguments, 
HqlTreeBuilder treeBuilder, 
IHqlExpressionVisitor visitor) 
    { 
     return treeBuilder.Concat(
      new[] 
      { 
       visitor.Visit(arguments[0]).AsExpression(), 
       visitor.Visit(arguments[1]).AsExpression() 
      }); 
    } 
} 

अपने HQLGeneratorsRegistry को यह जोड़ें और आप आप LINQ बयान में string.Concat के लिए कॉल के साथ जाने का अच्छा होगा:

+0

का उपयोग कर रहे हैं ऐसा लगता है कि nhib LINQ जानता है फ़ंक्शन स्ट्रिंग के बारे में कुछ नहीं। कॉनकैट, लेकिन यह विस्तार योग्य है ताकि आप इसे समझने के लिए linq के लिए Concat को कार्यान्वित कर सकें – jjjjj

+0

jjjjj, क्या आपको एक linq अधिभार फ़ंक्शन लिखने का नमूना मिला है? – andrewjboyd

+0

दीप्ति-मेहता, वे दोनों प्रकार की स्ट्रिंग हैं और डेटाबेस में, यूरी एक वर्चर है ... मुद्दा यह है कि कैसे MySQL SQL सर्वर के विपरीत स्ट्रिंग कॉन्सटेनेशन को संभालता है, आपको कॉन्सट फ़ंक्शन का उपयोग करना चाहिए जो NHibernate प्रतीत नहीं होता है linq पर इसके प्रयास में पहचानें ... फिर भी – andrewjboyd

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