मैं NHibernate 3.1.0 का उपयोग कर रहा है और मैं BaseHqlGeneratorForMethod
का उपयोग करने और DefaultLinqToHqlGeneratorsRegistry
रूप Fabio's post में विस्तार से बताया बढ़ा कर LINQ प्रदाता विस्तार करने के लिए कोशिश कर रहा हूँ के साथ संयोजन में।विस्तार LINQ, गतिशील LINQ समस्या
उदाहरण के लिए, ToString()
का समर्थन करने के लिए मैंने नीचे ToStringGenerator
बनाया है।
internal class ToStringGenerator : BaseHqlGeneratorForMethod
{
public ToStringGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<object>(x => x.ToString())
};
}
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Cast(visitor.Visit(targetObject).AsExpression(), typeof(string));
}
}
और मैं
internal class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public CustomLinqToHqlGeneratorsRegistry()
{
this.Merge(new ToStringGenerator());
}
}
का उपयोग कर आदि अभी तक यह "स्थिर" प्रश्नों के लिए काम करता है, मैं इसे इस तरह उपयोग कर सकते हैं पंजीकृत किया है:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where(p => p.Id.ToString().Contains(pId));
यह करने के लिए सही ढंग से अनुवाद करता है इसके एसक्यूएल समकक्ष (एसक्यूएल सर्वर 2008 का उपयोग कर)
where cast(project0_.Id as NVARCHAR(255)) like (''%''[email protected]+''%'')
समस्या पैदा होती है जब मैं इस तरह माइक्रोसॉफ्ट गतिशील LINQ पुस्तकालय (this Scott Guthrie's post में चर्चा) के साथ संयोजन में इसका इस्तेमाल करने की कोशिश:
var results = mSession.Query<Project>();
string pId = "1";
results = results.Where("Id.ToString().Contains(@0)", pId);
यह "System.String ToString के संदेश के साथ एक NotSupportedException में जो परिणाम() "(जो ऊपर वर्णित कक्षाओं को लागू करने से पहले स्थिर प्रश्नों के साथ सटीक वही संदेश था)। इस अपवाद को "एनएचबेर्नेट" और "" पर स्टैकट्रेस के साथ एनएचबर्ननेट.लिंक.विजिटर.एचक्लजेनरेटर एक्स्पेरेशन ट्रीविज़िटर। विज़िटमैथेटर कैलएक्सप्रेस (विधिकॉलएक्सप्रेस अभिव्यक्ति) "के स्रोत के साथ फेंक दिया जा रहा है।
तो मैं यहां क्या खो रहा हूं? मैंने गलत क्या किया है, या इस परिदृश्य का समर्थन करने के लिए क्या करने की आवश्यकता है?
यह मर्ज कार्यान्वयन में एक बग की तरह लगता है। – murki