2016-11-09 81 views
0

我正在使用NHibernate和NHibernate.Spatial。後者是在配置定義爲與該值的話:添加LinqToHqlGeneratorsRegistry不包括方言方法

<property name="dialect">NHibernate.Spatial.Dialect.MsSql2012GeometryDialect, NHibernate.Spatial.MsSql</property> 

當我建立會話工廠和評價它,它示出了189種命名方法(參見Settings.LinqToHqlGeneratorsRegistry.registeredMethods)。

沒有方言的數目爲147的區別解析爲典型的空間功能,如內,距離,面積

我需要字符串連接的支持,所以我創建了一個定製HQL發電機這樣:

public class ConcatHqlGenerator : BaseHqlGeneratorForMethod 
{ 
    public ConcatHqlGenerator() : base() 
    { 
     SupportedMethods = new[] 
     { 
      ReflectionHelper.GetMethodDefinition(() => string.Concat(null, null)), 
      ReflectionHelper.GetMethodDefinition(() => string.Concat(null, null, null)), 
      ReflectionHelper.GetMethodDefinition(() => string.Concat(null, null, 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() 
     }); 
    } 
} 

public class LinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry 
{ 
    public LinqToHqlGeneratorsRegistry() : base() 
    { 
     this.Merge(new ConcatHqlGenerator()); 
    } 
} 

之前建立會話工廠這樣,我註冊:

configuration.Properties.Add(NHibernate.Cfg.Environment.LinqToHqlGeneratorsRegistry, typeof(LinqToHqlGeneratorsRegistry).AssemblyQualifiedName); 

然而,當我做到這一點的空間方法(由方言介紹)不加載並使用LINQ功能,如等評估的設置也當我得到的錯誤顯示,註冊方法計數爲150 ,這是默認的147和額外的自定義三。

有沒有人使用過NHibernate.Spatial,還創建了自定義HQL生成器的組合,並得到這個工作?

回答

0

繼承NHibernate.Spatial.Linq.Functions.SpatialLinqToHqlGeneratorsRegistry而不是NHibernate.Linq.Functions.DefaultLinqToHqlGeneratorsRegistry