अपने LINQ बनाने के लिए कोई आसान तरीका नहीं है प्रश्न काम आपके परिदृश्य में समस्या यह है कि एनएचबीर्नेट को पता नहीं है कि DateTime.AddHours(double hours)
विधि का अनुवाद कैसे करें। लेकिन क्या आप एक समान प्रश्न लिखने के लिए एचक्यूएल का उपयोग कर सकते हैं? जाहिरा तौर पर नहीं। कोई मानक एचक्यूएल AddHours समारोह नहीं है। इसलिए आपको यह नया फ़ंक्शन पंजीकृत करना होगा। NHibernate hql और विक्रेता-विशिष्ट SQL वाक्यविन्यास के बीच अनुवाद करने के लिए बोलीभाषा का उपयोग करता है। ऐसा करने के लिए आपको एक नई बोलीभाषा वर्ग को एक exising से प्राप्त करना होगा और RegisterFunctions विधि को ओवरराइड करना होगा। लेकिन यह समस्या का केवल पहला आधा हल करता है। इसके बाद आपको LINQ में इस फ़ंक्शन का उपयोग करने के लिए NHibernate को दिखाना होगा। आपको DateTime.AddHours(double hours)
विधि और प्रीवियोसी पंजीकृत कस्टम एचक्यूएल फ़ंक्शन के बीच "मानचित्र" करना होगा। NHibernate इस उद्देश्य के लिए एक रजिस्ट्री का उपयोग करता है। आपको डिफ़ॉल्ट linq-to-hql रजिस्ट्री का विस्तार करना होगा।
मैं एक उदाहरण है कि NHibernate के साथ काम किया है दिखाएगा 3.3
एक नई बोली कक्षा बनाएं (मेरे उदाहरण पूर्वनिर्धारित MsSql2008Dialect का उपयोग करता है)
public class EnhancedMsSql2008Dialect : MsSql2008Dialect
{
protected override void RegisterFunctions() {
base.RegisterFunctions();
RegisterFunction("add_hours", new SQLFunctionTemplate(NHibernateUtil.DateTime, "dateadd(hour, ?1, ?2)"));
}
}
एक नया LINQ करने वाली HQL जनरेटर वर्ग जानता बनाएं AddHours विधि
using NHibernate.Linq.Functions;
using NHibernate.Linq;
using NHibernate.Hql.Ast;
public class DateTimeMethodsHqlGenerator : BaseHqlGeneratorForMethod
{
public DateTimeMethodsHqlGenerator() {
SupportedMethods = new[] {
ReflectionHelper.GetMethodDefinition((DateTime x) => x.AddHours(1))
};
}
public override HqlTreeNode BuildHql(System.Reflection.MethodInfo method, System.Linq.Expressions.Expression targetObject, System.Collections.ObjectModel.ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, NHibernate.Linq.Visitors.IHqlExpressionVisitor visitor) {
return treeBuilder.MethodCall("add_hours", visitor.Visit(arguments[0]).AsExpression(), visitor.Visit(targetObject).AsExpression());
}
}
अनुवाद करने के लिए कैसे डिफ़ॉल्ट बढ़ाएँ LINQ करने वाली HQL रजिस्ट्री वर्ग
public class EnhancedLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public EnhancedLinqToHqlGeneratorsRegistry() : base() {
//
RegisterGenerator(ReflectionHelper.GetMethodDefinition((DateTime x) => x.AddHours(1)), new DateTimeMethodsHqlGenerator());
}
}
कॉन्फ़िगर
cfg.DataBaseIntegration(c => {
c.Dialect<EnhancedMsSql2008Dialect>();
});
cfg.LinqToHqlGeneratorsRegistry<EnhancedLinqToHqlGeneratorsRegistry>();
आप NH3.3 का उपयोग कर रहे हैं? और कोड द्वारा मैपिंग? – Rippo
हां, मैं –