添加LinqToHqlGeneratorsRegistry排除方言方法
本文关键字:方法 方言 排除 LinqToHqlGeneratorsRegistry 添加 | 更新日期: 2023-09-27 18:16:59
我正在使用NHibernate和NHibernate. spatial。后者在配置中定义为具有以下值的方言:
<property name="dialect">NHibernate.Spatial.Dialect.MsSql2012GeometryDialect, NHibernate.Spatial.MsSql</property>
当我构建SessionFactory并评估它时,它显示了189个命名方法(参见Settings.LinqToHqlGeneratorsRegistry.registeredMethods)。
如果没有方言,这个数字是147。区别在于典型的空间功能,如Within, Distance, Area等。
我需要支持字符串连接,所以我创建了一个自定义的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函数(如Within等)时会出现错误。评估设置还显示,注册的方法计数现在是150,即默认的147和额外的自定义3。
有人用过NHibernate吗?空间和还创建了自定义HQL生成器的组合,并得到了这个工作?
继承NHibernate.Spatial.Linq.Functions.SpatialLinqToHqlGeneratorsRegistry而不是NHibernate.Linq.Functions.DefaultLinqToHqlGeneratorsRegistry