sizin LINQ yapmak için kolay bir yolu yoktur sorgulama çalışması. Senaryosundaki sorun, NHibernate'in DateTime.AddHours(double hours)
yöntemini nasıl çevireceğini bilmemesidir. Ama benzer bir sorgu yazmak için HQL'yi kullanabilir misiniz? Görünüşe göre öyle değil. Standart HQL AddHours işlevi yoktur. Bu nedenle bu yeni fonksiyonu kaydetmelisiniz. NHibernate, hql ve satıcıya özgü SQL sözdizimi arasında çeviri yapmak için lehçeleri kullanır. Bunu yapabilmek için, yeni bir dilden türeyen yeni bir konuşma sınıfı oluşturmalı ve RegisterFunctions yöntemini geçersiz kılmalısınız. Fakat bu problemin sadece ilk yarısını çözüyor. Daha sonra, NHibernate'i bu işlevi LINQ'de nasıl kullanacağınızı göstermelisiniz. DateTime.AddHours(double hours)
yöntemi ve önceden kayıtlı özel hql işlevi arasında "map" yapmalısınız. NHibernate bu amaç için bir kayıt defteri kullanır. Varsayılan linq-to-hql kayıt defterini genişletmeniz gerekecek. NHibernate ile çalıştı bir örnek gösterecektir
3,3
(benim örnek önceden tanımlanmış MsSql2008Dialect kullanır)
public class EnhancedMsSql2008Dialect : MsSql2008Dialect
{
protected override void RegisterFunctions() {
base.RegisterFunctions();
RegisterFunction("add_hours", new SQLFunctionTemplate(NHibernateUtil.DateTime, "dateadd(hour, ?1, ?2)"));
}
}
bilmediği yeni LINQ HQL jeneratör sınıf oluşturma Yeni bir lehçesi sınıf oluşturun AddHours yöntemini
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());
}
}
çevirmek için nasıl varsayılan uzatın LINQ HQL kayıt sınıf
public class EnhancedLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
public EnhancedLinqToHqlGeneratorsRegistry() : base() {
//
RegisterGenerator(ReflectionHelper.GetMethodDefinition((DateTime x) => x.AddHours(1)), new DateTimeMethodsHqlGenerator());
}
}
yapılandır
cfg.DataBaseIntegration(c => {
c.Dialect<EnhancedMsSql2008Dialect>();
});
cfg.LinqToHqlGeneratorsRegistry<EnhancedLinqToHqlGeneratorsRegistry>();
Eğer NH3.3 kullanıyor musunuz? ve kod ile eşleme? – Rippo
Evet, ikisini de kullanıyorum –