NHibernate 3, динамический компонент, словари и запросы LINQ - PullRequest
7 голосов
/ 18 апреля 2011

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

Ответы [ 2 ]

4 голосов
/ 08 июля 2013

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

4 голосов
/ 22 апреля 2011

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

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

Здесь мы надеемся, что исправление может быть разработано для версии 3.2

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

...