NHibernate 3,动态组件,词典和LINQ查询

Are*_*ren 7 .net c# nhibernate linq-to-nhibernate

我有这个实体,上面有一个<dynamic-component>条目和许多属性.它被作为一个实体类消费 IDictionary.

映射工作正常,一切都很糟糕,直到我根据这个字典中的值进行查询.

首先,我尝试了以下linq查询:

repository.Where(x => x.Specifications[key] == value) 
Run Code Online (Sandbox Code Playgroud)

要查询它.(规格是动态组件)查询导致以下错误:

未处理的异常:System.InvalidCastException:无法将类型为'NHibernate.Type.ComponentType'的对象强制转换为'NHibernate.Type.CollectionType'.

确定这可能超出了Linq Provider的界限,然后我继续构建一个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(); 
Run Code Online (Sandbox Code Playgroud)

这对于生成正确的SQL非常有用,除了表达式被缓存,因此后续调用此函数会将所有值与第一个键进行比较.

从这里我找到了treeBuilder.DictionaryItem(...)AST节点并构建了以下内容:

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

我再次遇到以下错误:

未处理的异常: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> 
Run Code Online (Sandbox Code Playgroud)

实体:

/// <summary> 
/// Specifications 
/// </summary> 
public virtual IDictionary Specifications { get; set; } 
Run Code Online (Sandbox Code Playgroud)

Dan*_*elg 4

由于 NHibernate linq 提供程序中的错误,从 3.1.0 开始,您将无法使用它来查询动态组件

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

希望3.2版本能够修复

同时,您应该使用 Criteria 或 HQL 查询。