添加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生成器的组合,并得到了这个工作?

添加LinqToHqlGeneratorsRegistry排除方言方法

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