2011-04-18 14 views
7

Tengo esta entidad con una entrada <dynamic-component> y una serie de propiedades en ella. Se está consumiendo en la clase de entidad como IDictionary.NHibernate 3, Componente dinámico, Diccionarios y consultas LINQ

El mapeo funciona bien y todo es Hunky Dory hasta Voy a consultar en base a los valores de este diccionario.

Primero probé la siguiente consulta LINQ:

repository.Where(x => x.Specifications[key] == value) 

Para consultar en contra de ella. (Las especificaciones es el componente dinámico) La consulta dio como resultado el siguiente error:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'NHibernate.Type.ComponentType' to type 'NHibernate.Type.CollectionType'.

calcular esto podría estar fuera de los límites del proveedor LINQ Entonces pasó a construir un BaseHqlGeneratorForMethod para manejar una costumbre LINQ extensión para ello.

Fue construido mediante el uso de la AST treeBuilder.Dot(...) así:

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(); 

Esto funcionó muy bien para generar el SQL derecho, sino que la expresión se almacena en caché las llamadas de manera posteriores a esta función sería comparar todos los valores contra la primera clave.

Desde aquí me encontré con el Nodo treeBuilder.DictionaryItem(...) AST y construyeron los siguientes:

var specificationExpression = 
    treeBuilder.Dot( 
    visitor.Visit(arguments[0]).AsExpression(), 
    treeBuilder.Ident("Specifications")).AsExpression(); 
var specification = 
    treeBuilder.DictionaryItem(specificationExpression, key).AsExpression(); 

Una vez más me encontré con el siguiente error:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'NHibernate.Type.ComponentType' to type 'NHibernate.Type.CollectionType'.


La pregunta

¿Qué estoy haciendo mal aquí? ¿No se puede consultar <dynamic-component>? ¿Estoy implementando esto incorrectamente? ¿Podría ser esto un error que debería informar?

Mapping:

<dynamic-component name="Specifications"> 
    <property name="sp_Graphics" column="sp_Graphics" /> 
    <property name="sp_Weight" column="sp_Weight" /> 
</dynamic-component> 

Entidad:

/// <summary> 
/// Specifications 
/// </summary> 
public virtual IDictionary Specifications { get; set; } 

Respuesta

4

Debido a un error en el proveedor LINQ NHibernate usted no será capaz de utilizarlo para consultar los componentes dinámicos a partir de 3.1.0

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

Aquí está la esperanza de que se pueda solucionar un problema versión 3.2

Mientras tanto, debe utilizar una consulta Criteria o HQL.