NHibernate 3, динамический компонент, словари и запросы LINQ

У меня есть эта сущность с записью <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; } 

person Aren    schedule 18.04.2011    source источник


Ответы (2)


Из-за ошибки в провайдере NHibernate linq вы не сможете использовать его для запроса динамических компонентов начиная с версии 3.1.0.

https://nhibernate.jira.com/browse/NH-2664

Надеемся, что исправление удастся разработать для версии 3.2.

А пока вы должны использовать критерии или запрос HQL.

person Danielg    schedule 21.04.2011

Это исправлено, начиная с NHibernate 3.3.1 (действительная ссылка здесь: https://nhibernate.jira.com/browse/NH-2664)

person Sÿl    schedule 08.07.2013
comment
Хорошо поймал. Спасибо за обновление вопроса. - person Phill; 08.07.2013