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; }
Buena atrapada. Gracias por actualizar la pregunta. – Phill