У меня есть эта сущность с записью <dynamic-component>
и рядом свойств. Он используется в классе сущности как IDictionary
.
Сопоставление работает нормально, и все работает как надо, пока я не перейду к запросу, основанному на значениях в этом словаре.
Сначала я попробовал следующий запрос linq:
repository.Where(x => x.Specifications[key] == value)
Чтобы запросить это. (Спецификация - динамический компонент) Запрос привел к следующей ошибке:
Необработанное исключение: System.InvalidCastException: невозможно привести объект типа NHibernate.Type.ComponentType к типу NHibernate.Type.CollectionType.
Полагая, что это может выходить за рамки провайдера Linq, я затем построил BaseHqlGeneratorForMethod
, чтобы обрабатывать для него настраиваемое расширение linq.
Он был создан с использованием treeBuilder.Dot(...)
AST следующим образом:
var specificationExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident("Specifications")).AsExpression();
var targetExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident(keyExpression.Value.ToString())).AsExpression();
Это отлично сработало для генерации правильного SQL, за исключением того, что выражение кэшируется, поэтому последующие вызовы этой функции будут сравнивать все значения с первым ключом.
Отсюда я нашел узел treeBuilder.DictionaryItem(...)
AST и построил следующее:
var specificationExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident("Specifications")).AsExpression();
var specification =
treeBuilder.DictionaryItem(specificationExpression, key).AsExpression();
В очередной раз я столкнулся со следующей ошибкой:
Необработанное исключение: System.InvalidCastException: невозможно привести объект типа NHibernate.Type.ComponentType к типу NHibernate.Type.CollectionType.
Вопрос
Что я здесь делаю не так? Можно ли не запрашивать <dynamic-component>
? Я это неправильно реализую? Может быть, это ошибка, о которой я должен сообщить?
Отображение:
<dynamic-component name="Specifications">
<property name="sp_Graphics" column="sp_Graphics" />
<property name="sp_Weight" column="sp_Weight" />
</dynamic-component>
Организация:
/// <summary>
/// Specifications
/// </summary>
public virtual IDictionary Specifications { get; set; }