Добавление LinqToHqlGeneratorsRegistry исключает методы диалекта
Я использую NHibernate и NHibernate.Spatial. Последний определяется в конфигурации как диалект с этим значением:
<property name="dialect">NHibernate.Spatial.Dialect.MsSql2012GeometryDialect, NHibernate.Spatial.MsSql</property>
Когда я собираю SessionFactory и оцениваю его, он показывает 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, таких как Within и т. Д. Оценка настроек также показывает, что число зарегистрированных методов теперь равно 150, что по умолчанию равно 147, и дополнительные обычай три.
Кто-нибудь использовал NHibernate.Spatial, а также создал собственные HQL-генераторы в комбинации и заставил это работать?
1 ответ
Унаследуйте NHibernate.Spatial.Linq.Functions.SpatialLinqToHqlGeneratorsRegistry, а не NHibernate.Linq.Functions.DefaultLinqToHqlGeneratorsRegistry