У меня есть эта сущность с записью <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 Node и построил следующее:
var specificationExpression =
treeBuilder.Dot(
visitor.Visit(arguments[0]).AsExpression(),
treeBuilder.Ident("Specifications")).AsExpression();
var specification =
treeBuilder.DictionaryItem(specificationExpression, key).AsExpression();
Еще раз я встретился со следующей ошибкой:
UnhandledИсключение: 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; }